Re: [PATCH 11/12] cgroup: replace cftype->read_seq_string() with cftype->seq_show()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed 27-11-13 18:42:38, Tejun Heo wrote:
> In preparation of conversion to kernfs, cgroup file handling is
> updated so that it can be easily mapped to kernfs.  This patch
> replaces cftype->read_seq_string() with cftype->seq_show() which is
> not limited to single_open() operation and will map directcly to
> kernfs seq_file interface.
> 
> The conversions are mechanical.  As ->seq_show() doesn't have @css and
> @cft, the functions which make use of them are converted to use
> seq_css() and seq_cft() respectively.  In several occassions, e.f. if
> it has seq_string in its name, the function name is updated to fit the
> new method better.
> 
> This patch does not introduce any behavior changes.
> 
> Signed-off-by: Tejun Heo <tj@xxxxxxxxxx>
> Cc: Jens Axboe <axboe@xxxxxxxxx>
> Cc: Vivek Goyal <vgoyal@xxxxxxxxxx>
> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> Cc: Johannes Weiner <hannes@xxxxxxxxxxx>
> Cc: Michal Hocko <mhocko@xxxxxxx>
> Cc: Balbir Singh <bsingharora@xxxxxxxxx>
> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx>
> Cc: Neil Horman <nhorman@xxxxxxxxxxxxx>
> Cc: Daniel Wagner <daniel.wagner@xxxxxxxxxxxx>
> Cc: Aristeu Rozanski <arozansk@xxxxxxxxxx>

Looks good to me. For memcg part
Acked-by: Michal Hocko <mhocko@xxxxxxx>

Thanks!

> ---
>  block/blk-throttle.c      |  35 ++++++-------
>  block/cfq-iosched.c       | 131 ++++++++++++++++++++--------------------------
>  include/linux/cgroup.h    |   9 ++--
>  kernel/cgroup.c           |  34 ++++++------
>  kernel/cgroup_freezer.c   |   7 ++-
>  kernel/cpuset.c           |  12 ++---
>  kernel/sched/core.c       |   7 ++-
>  kernel/sched/cpuacct.c    |  14 +++--
>  mm/memcontrol.c           |  28 +++++-----
>  net/core/netprio_cgroup.c |   8 +--
>  security/device_cgroup.c  |   7 ++-
>  11 files changed, 128 insertions(+), 164 deletions(-)
> 
> diff --git a/block/blk-throttle.c b/block/blk-throttle.c
> index 0653404..a760857 100644
> --- a/block/blk-throttle.c
> +++ b/block/blk-throttle.c
> @@ -1303,13 +1303,10 @@ static u64 tg_prfill_cpu_rwstat(struct seq_file *sf,
>  	return __blkg_prfill_rwstat(sf, pd, &rwstat);
>  }
>  
> -static int tg_print_cpu_rwstat(struct cgroup_subsys_state *css,
> -			       struct cftype *cft, struct seq_file *sf)
> +static int tg_print_cpu_rwstat(struct seq_file *sf, void *v)
>  {
> -	struct blkcg *blkcg = css_to_blkcg(css);
> -
> -	blkcg_print_blkgs(sf, blkcg, tg_prfill_cpu_rwstat, &blkcg_policy_throtl,
> -			  cft->private, true);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), tg_prfill_cpu_rwstat,
> +			  &blkcg_policy_throtl, seq_cft(sf)->private, true);
>  	return 0;
>  }
>  
> @@ -1335,19 +1332,17 @@ static u64 tg_prfill_conf_uint(struct seq_file *sf, struct blkg_policy_data *pd,
>  	return __blkg_prfill_u64(sf, pd, v);
>  }
>  
> -static int tg_print_conf_u64(struct cgroup_subsys_state *css,
> -			     struct cftype *cft, struct seq_file *sf)
> +static int tg_print_conf_u64(struct seq_file *sf, void *v)
>  {
> -	blkcg_print_blkgs(sf, css_to_blkcg(css), tg_prfill_conf_u64,
> -			  &blkcg_policy_throtl, cft->private, false);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), tg_prfill_conf_u64,
> +			  &blkcg_policy_throtl, seq_cft(sf)->private, false);
>  	return 0;
>  }
>  
> -static int tg_print_conf_uint(struct cgroup_subsys_state *css,
> -			      struct cftype *cft, struct seq_file *sf)
> +static int tg_print_conf_uint(struct seq_file *sf, void *v)
>  {
> -	blkcg_print_blkgs(sf, css_to_blkcg(css), tg_prfill_conf_uint,
> -			  &blkcg_policy_throtl, cft->private, false);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), tg_prfill_conf_uint,
> +			  &blkcg_policy_throtl, seq_cft(sf)->private, false);
>  	return 0;
>  }
>  
> @@ -1428,40 +1423,40 @@ static struct cftype throtl_files[] = {
>  	{
>  		.name = "throttle.read_bps_device",
>  		.private = offsetof(struct throtl_grp, bps[READ]),
> -		.read_seq_string = tg_print_conf_u64,
> +		.seq_show = tg_print_conf_u64,
>  		.write_string = tg_set_conf_u64,
>  		.max_write_len = 256,
>  	},
>  	{
>  		.name = "throttle.write_bps_device",
>  		.private = offsetof(struct throtl_grp, bps[WRITE]),
> -		.read_seq_string = tg_print_conf_u64,
> +		.seq_show = tg_print_conf_u64,
>  		.write_string = tg_set_conf_u64,
>  		.max_write_len = 256,
>  	},
>  	{
>  		.name = "throttle.read_iops_device",
>  		.private = offsetof(struct throtl_grp, iops[READ]),
> -		.read_seq_string = tg_print_conf_uint,
> +		.seq_show = tg_print_conf_uint,
>  		.write_string = tg_set_conf_uint,
>  		.max_write_len = 256,
>  	},
>  	{
>  		.name = "throttle.write_iops_device",
>  		.private = offsetof(struct throtl_grp, iops[WRITE]),
> -		.read_seq_string = tg_print_conf_uint,
> +		.seq_show = tg_print_conf_uint,
>  		.write_string = tg_set_conf_uint,
>  		.max_write_len = 256,
>  	},
>  	{
>  		.name = "throttle.io_service_bytes",
>  		.private = offsetof(struct tg_stats_cpu, service_bytes),
> -		.read_seq_string = tg_print_cpu_rwstat,
> +		.seq_show = tg_print_cpu_rwstat,
>  	},
>  	{
>  		.name = "throttle.io_serviced",
>  		.private = offsetof(struct tg_stats_cpu, serviced),
> -		.read_seq_string = tg_print_cpu_rwstat,
> +		.seq_show = tg_print_cpu_rwstat,
>  	},
>  	{ }	/* terminate */
>  };
> diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
> index 4d5cec1..744833b 100644
> --- a/block/cfq-iosched.c
> +++ b/block/cfq-iosched.c
> @@ -1632,11 +1632,11 @@ static u64 cfqg_prfill_weight_device(struct seq_file *sf,
>  	return __blkg_prfill_u64(sf, pd, cfqg->dev_weight);
>  }
>  
> -static int cfqg_print_weight_device(struct cgroup_subsys_state *css,
> -				    struct cftype *cft, struct seq_file *sf)
> +static int cfqg_print_weight_device(struct seq_file *sf, void *v)
>  {
> -	blkcg_print_blkgs(sf, css_to_blkcg(css), cfqg_prfill_weight_device,
> -			  &blkcg_policy_cfq, 0, false);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)),
> +			  cfqg_prfill_weight_device, &blkcg_policy_cfq,
> +			  0, false);
>  	return 0;
>  }
>  
> @@ -1650,26 +1650,23 @@ static u64 cfqg_prfill_leaf_weight_device(struct seq_file *sf,
>  	return __blkg_prfill_u64(sf, pd, cfqg->dev_leaf_weight);
>  }
>  
> -static int cfqg_print_leaf_weight_device(struct cgroup_subsys_state *css,
> -					 struct cftype *cft,
> -					 struct seq_file *sf)
> +static int cfqg_print_leaf_weight_device(struct seq_file *sf, void *v)
>  {
> -	blkcg_print_blkgs(sf, css_to_blkcg(css), cfqg_prfill_leaf_weight_device,
> -			  &blkcg_policy_cfq, 0, false);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)),
> +			  cfqg_prfill_leaf_weight_device, &blkcg_policy_cfq,
> +			  0, false);
>  	return 0;
>  }
>  
> -static int cfq_print_weight(struct cgroup_subsys_state *css, struct cftype *cft,
> -			    struct seq_file *sf)
> +static int cfq_print_weight(struct seq_file *sf, void *v)
>  {
> -	seq_printf(sf, "%u\n", css_to_blkcg(css)->cfq_weight);
> +	seq_printf(sf, "%u\n", css_to_blkcg(seq_css(sf))->cfq_weight);
>  	return 0;
>  }
>  
> -static int cfq_print_leaf_weight(struct cgroup_subsys_state *css,
> -				 struct cftype *cft, struct seq_file *sf)
> +static int cfq_print_leaf_weight(struct seq_file *sf, void *v)
>  {
> -	seq_printf(sf, "%u\n", css_to_blkcg(css)->cfq_leaf_weight);
> +	seq_printf(sf, "%u\n", css_to_blkcg(seq_css(sf))->cfq_leaf_weight);
>  	return 0;
>  }
>  
> @@ -1762,23 +1759,17 @@ static int cfq_set_leaf_weight(struct cgroup_subsys_state *css,
>  	return __cfq_set_weight(css, cft, val, true);
>  }
>  
> -static int cfqg_print_stat(struct cgroup_subsys_state *css, struct cftype *cft,
> -			   struct seq_file *sf)
> +static int cfqg_print_stat(struct seq_file *sf, void *v)
>  {
> -	struct blkcg *blkcg = css_to_blkcg(css);
> -
> -	blkcg_print_blkgs(sf, blkcg, blkg_prfill_stat, &blkcg_policy_cfq,
> -			  cft->private, false);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), blkg_prfill_stat,
> +			  &blkcg_policy_cfq, seq_cft(sf)->private, false);
>  	return 0;
>  }
>  
> -static int cfqg_print_rwstat(struct cgroup_subsys_state *css,
> -			     struct cftype *cft, struct seq_file *sf)
> +static int cfqg_print_rwstat(struct seq_file *sf, void *v)
>  {
> -	struct blkcg *blkcg = css_to_blkcg(css);
> -
> -	blkcg_print_blkgs(sf, blkcg, blkg_prfill_rwstat, &blkcg_policy_cfq,
> -			  cft->private, true);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), blkg_prfill_rwstat,
> +			  &blkcg_policy_cfq, seq_cft(sf)->private, true);
>  	return 0;
>  }
>  
> @@ -1798,23 +1789,19 @@ static u64 cfqg_prfill_rwstat_recursive(struct seq_file *sf,
>  	return __blkg_prfill_rwstat(sf, pd, &sum);
>  }
>  
> -static int cfqg_print_stat_recursive(struct cgroup_subsys_state *css,
> -				     struct cftype *cft, struct seq_file *sf)
> +static int cfqg_print_stat_recursive(struct seq_file *sf, void *v)
>  {
> -	struct blkcg *blkcg = css_to_blkcg(css);
> -
> -	blkcg_print_blkgs(sf, blkcg, cfqg_prfill_stat_recursive,
> -			  &blkcg_policy_cfq, cft->private, false);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)),
> +			  cfqg_prfill_stat_recursive, &blkcg_policy_cfq,
> +			  seq_cft(sf)->private, false);
>  	return 0;
>  }
>  
> -static int cfqg_print_rwstat_recursive(struct cgroup_subsys_state *css,
> -				       struct cftype *cft, struct seq_file *sf)
> +static int cfqg_print_rwstat_recursive(struct seq_file *sf, void *v)
>  {
> -	struct blkcg *blkcg = css_to_blkcg(css);
> -
> -	blkcg_print_blkgs(sf, blkcg, cfqg_prfill_rwstat_recursive,
> -			  &blkcg_policy_cfq, cft->private, true);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)),
> +			  cfqg_prfill_rwstat_recursive, &blkcg_policy_cfq,
> +			  seq_cft(sf)->private, true);
>  	return 0;
>  }
>  
> @@ -1835,13 +1822,11 @@ static u64 cfqg_prfill_avg_queue_size(struct seq_file *sf,
>  }
>  
>  /* print avg_queue_size */
> -static int cfqg_print_avg_queue_size(struct cgroup_subsys_state *css,
> -				     struct cftype *cft, struct seq_file *sf)
> +static int cfqg_print_avg_queue_size(struct seq_file *sf, void *v)
>  {
> -	struct blkcg *blkcg = css_to_blkcg(css);
> -
> -	blkcg_print_blkgs(sf, blkcg, cfqg_prfill_avg_queue_size,
> -			  &blkcg_policy_cfq, 0, false);
> +	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)),
> +			  cfqg_prfill_avg_queue_size, &blkcg_policy_cfq,
> +			  0, false);
>  	return 0;
>  }
>  #endif	/* CONFIG_DEBUG_BLK_CGROUP */
> @@ -1851,14 +1836,14 @@ static struct cftype cfq_blkcg_files[] = {
>  	{
>  		.name = "weight_device",
>  		.flags = CFTYPE_ONLY_ON_ROOT,
> -		.read_seq_string = cfqg_print_leaf_weight_device,
> +		.seq_show = cfqg_print_leaf_weight_device,
>  		.write_string = cfqg_set_leaf_weight_device,
>  		.max_write_len = 256,
>  	},
>  	{
>  		.name = "weight",
>  		.flags = CFTYPE_ONLY_ON_ROOT,
> -		.read_seq_string = cfq_print_leaf_weight,
> +		.seq_show = cfq_print_leaf_weight,
>  		.write_u64 = cfq_set_leaf_weight,
>  	},
>  
> @@ -1866,26 +1851,26 @@ static struct cftype cfq_blkcg_files[] = {
>  	{
>  		.name = "weight_device",
>  		.flags = CFTYPE_NOT_ON_ROOT,
> -		.read_seq_string = cfqg_print_weight_device,
> +		.seq_show = cfqg_print_weight_device,
>  		.write_string = cfqg_set_weight_device,
>  		.max_write_len = 256,
>  	},
>  	{
>  		.name = "weight",
>  		.flags = CFTYPE_NOT_ON_ROOT,
> -		.read_seq_string = cfq_print_weight,
> +		.seq_show = cfq_print_weight,
>  		.write_u64 = cfq_set_weight,
>  	},
>  
>  	{
>  		.name = "leaf_weight_device",
> -		.read_seq_string = cfqg_print_leaf_weight_device,
> +		.seq_show = cfqg_print_leaf_weight_device,
>  		.write_string = cfqg_set_leaf_weight_device,
>  		.max_write_len = 256,
>  	},
>  	{
>  		.name = "leaf_weight",
> -		.read_seq_string = cfq_print_leaf_weight,
> +		.seq_show = cfq_print_leaf_weight,
>  		.write_u64 = cfq_set_leaf_weight,
>  	},
>  
> @@ -1893,114 +1878,114 @@ static struct cftype cfq_blkcg_files[] = {
>  	{
>  		.name = "time",
>  		.private = offsetof(struct cfq_group, stats.time),
> -		.read_seq_string = cfqg_print_stat,
> +		.seq_show = cfqg_print_stat,
>  	},
>  	{
>  		.name = "sectors",
>  		.private = offsetof(struct cfq_group, stats.sectors),
> -		.read_seq_string = cfqg_print_stat,
> +		.seq_show = cfqg_print_stat,
>  	},
>  	{
>  		.name = "io_service_bytes",
>  		.private = offsetof(struct cfq_group, stats.service_bytes),
> -		.read_seq_string = cfqg_print_rwstat,
> +		.seq_show = cfqg_print_rwstat,
>  	},
>  	{
>  		.name = "io_serviced",
>  		.private = offsetof(struct cfq_group, stats.serviced),
> -		.read_seq_string = cfqg_print_rwstat,
> +		.seq_show = cfqg_print_rwstat,
>  	},
>  	{
>  		.name = "io_service_time",
>  		.private = offsetof(struct cfq_group, stats.service_time),
> -		.read_seq_string = cfqg_print_rwstat,
> +		.seq_show = cfqg_print_rwstat,
>  	},
>  	{
>  		.name = "io_wait_time",
>  		.private = offsetof(struct cfq_group, stats.wait_time),
> -		.read_seq_string = cfqg_print_rwstat,
> +		.seq_show = cfqg_print_rwstat,
>  	},
>  	{
>  		.name = "io_merged",
>  		.private = offsetof(struct cfq_group, stats.merged),
> -		.read_seq_string = cfqg_print_rwstat,
> +		.seq_show = cfqg_print_rwstat,
>  	},
>  	{
>  		.name = "io_queued",
>  		.private = offsetof(struct cfq_group, stats.queued),
> -		.read_seq_string = cfqg_print_rwstat,
> +		.seq_show = cfqg_print_rwstat,
>  	},
>  
>  	/* the same statictics which cover the cfqg and its descendants */
>  	{
>  		.name = "time_recursive",
>  		.private = offsetof(struct cfq_group, stats.time),
> -		.read_seq_string = cfqg_print_stat_recursive,
> +		.seq_show = cfqg_print_stat_recursive,
>  	},
>  	{
>  		.name = "sectors_recursive",
>  		.private = offsetof(struct cfq_group, stats.sectors),
> -		.read_seq_string = cfqg_print_stat_recursive,
> +		.seq_show = cfqg_print_stat_recursive,
>  	},
>  	{
>  		.name = "io_service_bytes_recursive",
>  		.private = offsetof(struct cfq_group, stats.service_bytes),
> -		.read_seq_string = cfqg_print_rwstat_recursive,
> +		.seq_show = cfqg_print_rwstat_recursive,
>  	},
>  	{
>  		.name = "io_serviced_recursive",
>  		.private = offsetof(struct cfq_group, stats.serviced),
> -		.read_seq_string = cfqg_print_rwstat_recursive,
> +		.seq_show = cfqg_print_rwstat_recursive,
>  	},
>  	{
>  		.name = "io_service_time_recursive",
>  		.private = offsetof(struct cfq_group, stats.service_time),
> -		.read_seq_string = cfqg_print_rwstat_recursive,
> +		.seq_show = cfqg_print_rwstat_recursive,
>  	},
>  	{
>  		.name = "io_wait_time_recursive",
>  		.private = offsetof(struct cfq_group, stats.wait_time),
> -		.read_seq_string = cfqg_print_rwstat_recursive,
> +		.seq_show = cfqg_print_rwstat_recursive,
>  	},
>  	{
>  		.name = "io_merged_recursive",
>  		.private = offsetof(struct cfq_group, stats.merged),
> -		.read_seq_string = cfqg_print_rwstat_recursive,
> +		.seq_show = cfqg_print_rwstat_recursive,
>  	},
>  	{
>  		.name = "io_queued_recursive",
>  		.private = offsetof(struct cfq_group, stats.queued),
> -		.read_seq_string = cfqg_print_rwstat_recursive,
> +		.seq_show = cfqg_print_rwstat_recursive,
>  	},
>  #ifdef CONFIG_DEBUG_BLK_CGROUP
>  	{
>  		.name = "avg_queue_size",
> -		.read_seq_string = cfqg_print_avg_queue_size,
> +		.seq_show = cfqg_print_avg_queue_size,
>  	},
>  	{
>  		.name = "group_wait_time",
>  		.private = offsetof(struct cfq_group, stats.group_wait_time),
> -		.read_seq_string = cfqg_print_stat,
> +		.seq_show = cfqg_print_stat,
>  	},
>  	{
>  		.name = "idle_time",
>  		.private = offsetof(struct cfq_group, stats.idle_time),
> -		.read_seq_string = cfqg_print_stat,
> +		.seq_show = cfqg_print_stat,
>  	},
>  	{
>  		.name = "empty_time",
>  		.private = offsetof(struct cfq_group, stats.empty_time),
> -		.read_seq_string = cfqg_print_stat,
> +		.seq_show = cfqg_print_stat,
>  	},
>  	{
>  		.name = "dequeue",
>  		.private = offsetof(struct cfq_group, stats.dequeue),
> -		.read_seq_string = cfqg_print_stat,
> +		.seq_show = cfqg_print_stat,
>  	},
>  	{
>  		.name = "unaccounted_time",
>  		.private = offsetof(struct cfq_group, stats.unaccounted_time),
> -		.read_seq_string = cfqg_print_stat,
> +		.seq_show = cfqg_print_stat,
>  	},
>  #endif	/* CONFIG_DEBUG_BLK_CGROUP */
>  	{ }	/* terminate */
> diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
> index c3d698a..b32a0f8 100644
> --- a/include/linux/cgroup.h
> +++ b/include/linux/cgroup.h
> @@ -444,12 +444,9 @@ struct cftype {
>  	 * read_s64() is a signed version of read_u64()
>  	 */
>  	s64 (*read_s64)(struct cgroup_subsys_state *css, struct cftype *cft);
> -	/*
> -	 * read_seq_string() is used for outputting a simple sequence
> -	 * using seqfile.
> -	 */
> -	int (*read_seq_string)(struct cgroup_subsys_state *css,
> -			       struct cftype *cft, struct seq_file *m);
> +
> +	/* generic seq_file read interface */
> +	int (*seq_show)(struct seq_file *sf, void *v);
>  
>  	/*
>  	 * write_u64() is a shortcut for the common case of accepting
> diff --git a/kernel/cgroup.c b/kernel/cgroup.c
> index 1189de7..39fdf75 100644
> --- a/kernel/cgroup.c
> +++ b/kernel/cgroup.c
> @@ -2212,10 +2212,9 @@ static int cgroup_release_agent_write(struct cgroup_subsys_state *css,
>  	return 0;
>  }
>  
> -static int cgroup_release_agent_show(struct cgroup_subsys_state *css,
> -				     struct cftype *cft, struct seq_file *seq)
> +static int cgroup_release_agent_show(struct seq_file *seq, void *v)
>  {
> -	struct cgroup *cgrp = css->cgroup;
> +	struct cgroup *cgrp = seq_css(seq)->cgroup;
>  
>  	if (!cgroup_lock_live_group(cgrp))
>  		return -ENODEV;
> @@ -2225,10 +2224,11 @@ static int cgroup_release_agent_show(struct cgroup_subsys_state *css,
>  	return 0;
>  }
>  
> -static int cgroup_sane_behavior_show(struct cgroup_subsys_state *css,
> -				     struct cftype *cft, struct seq_file *seq)
> +static int cgroup_sane_behavior_show(struct seq_file *seq, void *v)
>  {
> -	seq_printf(seq, "%d\n", cgroup_sane_behavior(css->cgroup));
> +	struct cgroup *cgrp = seq_css(seq)->cgroup;
> +
> +	seq_printf(seq, "%d\n", cgroup_sane_behavior(cgrp));
>  	return 0;
>  }
>  
> @@ -2291,8 +2291,8 @@ static int cgroup_seqfile_show(struct seq_file *m, void *arg)
>  	struct cftype *cft = seq_cft(m);
>  	struct cgroup_subsys_state *css = seq_css(m);
>  
> -	if (cft->read_seq_string)
> -		return cft->read_seq_string(css, cft, m);
> +	if (cft->seq_show)
> +		return cft->seq_show(m, arg);
>  
>  	if (cft->read_u64)
>  		seq_printf(m, "%llu\n", cft->read_u64(css, cft));
> @@ -2556,7 +2556,7 @@ static umode_t cgroup_file_mode(const struct cftype *cft)
>  	if (cft->mode)
>  		return cft->mode;
>  
> -	if (cft->read_u64 || cft->read_s64 || cft->read_seq_string)
> +	if (cft->read_u64 || cft->read_s64 || cft->seq_show)
>  		mode |= S_IRUGO;
>  
>  	if (cft->write_u64 || cft->write_s64 || cft->write_string ||
> @@ -3873,7 +3873,7 @@ static struct cftype cgroup_base_files[] = {
>  	{
>  		.name = "cgroup.sane_behavior",
>  		.flags = CFTYPE_ONLY_ON_ROOT,
> -		.read_seq_string = cgroup_sane_behavior_show,
> +		.seq_show = cgroup_sane_behavior_show,
>  	},
>  
>  	/*
> @@ -3898,7 +3898,7 @@ static struct cftype cgroup_base_files[] = {
>  	{
>  		.name = "release_agent",
>  		.flags = CFTYPE_INSANE | CFTYPE_ONLY_ON_ROOT,
> -		.read_seq_string = cgroup_release_agent_show,
> +		.seq_show = cgroup_release_agent_show,
>  		.write_string = cgroup_release_agent_write,
>  		.max_write_len = PATH_MAX,
>  	},
> @@ -5273,9 +5273,7 @@ static u64 current_css_set_refcount_read(struct cgroup_subsys_state *css,
>  	return count;
>  }
>  
> -static int current_css_set_cg_links_read(struct cgroup_subsys_state *css,
> -					 struct cftype *cft,
> -					 struct seq_file *seq)
> +static int current_css_set_cg_links_read(struct seq_file *seq, void *v)
>  {
>  	struct cgrp_cset_link *link;
>  	struct css_set *cset;
> @@ -5300,9 +5298,9 @@ static int current_css_set_cg_links_read(struct cgroup_subsys_state *css,
>  }
>  
>  #define MAX_TASKS_SHOWN_PER_CSS 25
> -static int cgroup_css_links_read(struct cgroup_subsys_state *css,
> -				 struct cftype *cft, struct seq_file *seq)
> +static int cgroup_css_links_read(struct seq_file *seq, void *v)
>  {
> +	struct cgroup_subsys_state *css = seq_css(seq);
>  	struct cgrp_cset_link *link;
>  
>  	read_lock(&css_set_lock);
> @@ -5348,12 +5346,12 @@ static struct cftype debug_files[] =  {
>  
>  	{
>  		.name = "current_css_set_cg_links",
> -		.read_seq_string = current_css_set_cg_links_read,
> +		.seq_show = current_css_set_cg_links_read,
>  	},
>  
>  	{
>  		.name = "cgroup_css_links",
> -		.read_seq_string = cgroup_css_links_read,
> +		.seq_show = cgroup_css_links_read,
>  	},
>  
>  	{
> diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c
> index f0ff64d..6c3154e 100644
> --- a/kernel/cgroup_freezer.c
> +++ b/kernel/cgroup_freezer.c
> @@ -301,10 +301,9 @@ out_unlock:
>  	spin_unlock_irq(&freezer->lock);
>  }
>  
> -static int freezer_read(struct cgroup_subsys_state *css, struct cftype *cft,
> -			struct seq_file *m)
> +static int freezer_read(struct seq_file *m, void *v)
>  {
> -	struct cgroup_subsys_state *pos;
> +	struct cgroup_subsys_state *css = seq_css(m), *pos;
>  
>  	rcu_read_lock();
>  
> @@ -458,7 +457,7 @@ static struct cftype files[] = {
>  	{
>  		.name = "state",
>  		.flags = CFTYPE_NOT_ON_ROOT,
> -		.read_seq_string = freezer_read,
> +		.seq_show = freezer_read,
>  		.write_string = freezer_write,
>  	},
>  	{
> diff --git a/kernel/cpuset.c b/kernel/cpuset.c
> index 032929f..4410ac6 100644
> --- a/kernel/cpuset.c
> +++ b/kernel/cpuset.c
> @@ -1732,12 +1732,10 @@ out_unlock:
>   * and since these maps can change value dynamically, one could read
>   * gibberish by doing partial reads while a list was changing.
>   */
> -static int cpuset_common_read_seq_string(struct cgroup_subsys_state *css,
> -					 struct cftype *cft,
> -					 struct seq_file *sf)
> +static int cpuset_common_seq_show(struct seq_file *sf, void *v)
>  {
> -	struct cpuset *cs = css_cs(css);
> -	cpuset_filetype_t type = cft->private;
> +	struct cpuset *cs = css_cs(seq_css(sf));
> +	cpuset_filetype_t type = seq_cft(sf)->private;
>  	ssize_t count;
>  	char *buf, *s;
>  	int ret = 0;
> @@ -1824,7 +1822,7 @@ static s64 cpuset_read_s64(struct cgroup_subsys_state *css, struct cftype *cft)
>  static struct cftype files[] = {
>  	{
>  		.name = "cpus",
> -		.read_seq_string = cpuset_common_read_seq_string,
> +		.seq_show = cpuset_common_seq_show,
>  		.write_string = cpuset_write_resmask,
>  		.max_write_len = (100U + 6 * NR_CPUS),
>  		.private = FILE_CPULIST,
> @@ -1832,7 +1830,7 @@ static struct cftype files[] = {
>  
>  	{
>  		.name = "mems",
> -		.read_seq_string = cpuset_common_read_seq_string,
> +		.seq_show = cpuset_common_seq_show,
>  		.write_string = cpuset_write_resmask,
>  		.max_write_len = (100U + 6 * MAX_NUMNODES),
>  		.private = FILE_MEMLIST,
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index f28ec67..7e8cbb9 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -7256,10 +7256,9 @@ static int __cfs_schedulable(struct task_group *tg, u64 period, u64 quota)
>  	return ret;
>  }
>  
> -static int cpu_stats_show(struct cgroup_subsys_state *css, struct cftype *cft,
> -			  struct seq_file *sf)
> +static int cpu_stats_show(struct seq_file *sf, void *v)
>  {
> -	struct task_group *tg = css_tg(css);
> +	struct task_group *tg = css_tg(seq_css(sf));
>  	struct cfs_bandwidth *cfs_b = &tg->cfs_bandwidth;
>  
>  	seq_printf(sf, "nr_periods %d\n", cfs_b->nr_periods);
> @@ -7318,7 +7317,7 @@ static struct cftype cpu_files[] = {
>  	},
>  	{
>  		.name = "stat",
> -		.read_seq_string = cpu_stats_show,
> +		.seq_show = cpu_stats_show,
>  	},
>  #endif
>  #ifdef CONFIG_RT_GROUP_SCHED
> diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
> index dd88738..622e081 100644
> --- a/kernel/sched/cpuacct.c
> +++ b/kernel/sched/cpuacct.c
> @@ -163,10 +163,9 @@ out:
>  	return err;
>  }
>  
> -static int cpuacct_percpu_seq_read(struct cgroup_subsys_state *css,
> -				   struct cftype *cft, struct seq_file *m)
> +static int cpuacct_percpu_seq_show(struct seq_file *m, void *V)
>  {
> -	struct cpuacct *ca = css_ca(css);
> +	struct cpuacct *ca = css_ca(seq_css(m));
>  	u64 percpu;
>  	int i;
>  
> @@ -183,10 +182,9 @@ static const char * const cpuacct_stat_desc[] = {
>  	[CPUACCT_STAT_SYSTEM] = "system",
>  };
>  
> -static int cpuacct_stats_show(struct cgroup_subsys_state *css,
> -			      struct cftype *cft, struct seq_file *sf)
> +static int cpuacct_stats_show(struct seq_file *sf, void *v)
>  {
> -	struct cpuacct *ca = css_ca(css);
> +	struct cpuacct *ca = css_ca(seq_css(sf));
>  	int cpu;
>  	s64 val = 0;
>  
> @@ -220,11 +218,11 @@ static struct cftype files[] = {
>  	},
>  	{
>  		.name = "usage_percpu",
> -		.read_seq_string = cpuacct_percpu_seq_read,
> +		.seq_show = cpuacct_percpu_seq_show,
>  	},
>  	{
>  		.name = "stat",
> -		.read_seq_string = cpuacct_stats_show,
> +		.seq_show = cpuacct_stats_show,
>  	},
>  	{ }	/* terminate */
>  };
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index f149521..9252219 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -3014,10 +3014,9 @@ static struct kmem_cache *memcg_params_to_cache(struct memcg_cache_params *p)
>  }
>  
>  #ifdef CONFIG_SLABINFO
> -static int mem_cgroup_slabinfo_read(struct cgroup_subsys_state *css,
> -				    struct cftype *cft, struct seq_file *m)
> +static int mem_cgroup_slabinfo_read(struct seq_file *m, void *v)
>  {
> -	struct mem_cgroup *memcg = mem_cgroup_from_css(css);
> +	struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m));
>  	struct memcg_cache_params *params;
>  
>  	if (!memcg_can_account_kmem(memcg))
> @@ -5418,8 +5417,7 @@ static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css,
>  #endif
>  
>  #ifdef CONFIG_NUMA
> -static int memcg_numa_stat_show(struct cgroup_subsys_state *css,
> -				struct cftype *cft, struct seq_file *m)
> +static int memcg_numa_stat_show(struct seq_file *m, void *v)
>  {
>  	struct numa_stat {
>  		const char *name;
> @@ -5435,7 +5433,7 @@ static int memcg_numa_stat_show(struct cgroup_subsys_state *css,
>  	const struct numa_stat *stat;
>  	int nid;
>  	unsigned long nr;
> -	struct mem_cgroup *memcg = mem_cgroup_from_css(css);
> +	struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m));
>  
>  	for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) {
>  		nr = mem_cgroup_nr_lru_pages(memcg, stat->lru_mask);
> @@ -5474,10 +5472,9 @@ static inline void mem_cgroup_lru_names_not_uptodate(void)
>  	BUILD_BUG_ON(ARRAY_SIZE(mem_cgroup_lru_names) != NR_LRU_LISTS);
>  }
>  
> -static int memcg_stat_show(struct cgroup_subsys_state *css, struct cftype *cft,
> -				 struct seq_file *m)
> +static int memcg_stat_show(struct seq_file *m, void *v)
>  {
> -	struct mem_cgroup *memcg = mem_cgroup_from_css(css);
> +	struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m));
>  	struct mem_cgroup *mi;
>  	unsigned int i;
>  
> @@ -5907,10 +5904,9 @@ static void mem_cgroup_oom_unregister_event(struct mem_cgroup *memcg,
>  	spin_unlock(&memcg_oom_lock);
>  }
>  
> -static int mem_cgroup_oom_control_read(struct cgroup_subsys_state *css,
> -				       struct cftype *cft, struct seq_file *sf)
> +static int mem_cgroup_oom_control_read(struct seq_file *sf, void *v)
>  {
> -	struct mem_cgroup *memcg = mem_cgroup_from_css(css);
> +	struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(sf));
>  
>  	seq_printf(sf, "oom_kill_disable %d\n", memcg->oom_kill_disable);
>  	seq_printf(sf, "under_oom %d\n", (bool)atomic_read(&memcg->under_oom));
> @@ -6260,7 +6256,7 @@ static struct cftype mem_cgroup_files[] = {
>  	},
>  	{
>  		.name = "stat",
> -		.read_seq_string = memcg_stat_show,
> +		.seq_show = memcg_stat_show,
>  	},
>  	{
>  		.name = "force_empty",
> @@ -6290,7 +6286,7 @@ static struct cftype mem_cgroup_files[] = {
>  	},
>  	{
>  		.name = "oom_control",
> -		.read_seq_string = mem_cgroup_oom_control_read,
> +		.seq_show = mem_cgroup_oom_control_read,
>  		.write_u64 = mem_cgroup_oom_control_write,
>  		.private = MEMFILE_PRIVATE(_OOM_TYPE, OOM_CONTROL),
>  	},
> @@ -6300,7 +6296,7 @@ static struct cftype mem_cgroup_files[] = {
>  #ifdef CONFIG_NUMA
>  	{
>  		.name = "numa_stat",
> -		.read_seq_string = memcg_numa_stat_show,
> +		.seq_show = memcg_numa_stat_show,
>  	},
>  #endif
>  #ifdef CONFIG_MEMCG_KMEM
> @@ -6330,7 +6326,7 @@ static struct cftype mem_cgroup_files[] = {
>  #ifdef CONFIG_SLABINFO
>  	{
>  		.name = "kmem.slabinfo",
> -		.read_seq_string = mem_cgroup_slabinfo_read,
> +		.seq_show = mem_cgroup_slabinfo_read,
>  	},
>  #endif
>  #endif
> diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c
> index 498710d..56cbb69 100644
> --- a/net/core/netprio_cgroup.c
> +++ b/net/core/netprio_cgroup.c
> @@ -173,14 +173,14 @@ static u64 read_prioidx(struct cgroup_subsys_state *css, struct cftype *cft)
>  	return css->cgroup->id;
>  }
>  
> -static int read_priomap(struct cgroup_subsys_state *css, struct cftype *cft,
> -			struct seq_file *sf)
> +static int read_priomap(struct seq_file *sf, void *v)
>  {
>  	struct net_device *dev;
>  
>  	rcu_read_lock();
>  	for_each_netdev_rcu(&init_net, dev)
> -		seq_printf(sf, "%s %u\n", dev->name, netprio_prio(css, dev));
> +		seq_printf(sf, "%s %u\n", dev->name,
> +			   netprio_prio(seq_css(sf), dev));
>  	rcu_read_unlock();
>  	return 0;
>  }
> @@ -238,7 +238,7 @@ static struct cftype ss_files[] = {
>  	},
>  	{
>  		.name = "ifpriomap",
> -		.read_seq_string = read_priomap,
> +		.seq_show = read_priomap,
>  		.write_string = write_priomap,
>  	},
>  	{ }	/* terminate */
> diff --git a/security/device_cgroup.c b/security/device_cgroup.c
> index 7c2a0a7..d3b6d2c 100644
> --- a/security/device_cgroup.c
> +++ b/security/device_cgroup.c
> @@ -274,10 +274,9 @@ static void set_majmin(char *str, unsigned m)
>  		sprintf(str, "%u", m);
>  }
>  
> -static int devcgroup_seq_read(struct cgroup_subsys_state *css,
> -			      struct cftype *cft, struct seq_file *m)
> +static int devcgroup_seq_show(struct seq_file *m, void *v)
>  {
> -	struct dev_cgroup *devcgroup = css_to_devcgroup(css);
> +	struct dev_cgroup *devcgroup = css_to_devcgroup(seq_css(m));
>  	struct dev_exception_item *ex;
>  	char maj[MAJMINLEN], min[MAJMINLEN], acc[ACCLEN];
>  
> @@ -679,7 +678,7 @@ static struct cftype dev_cgroup_files[] = {
>  	},
>  	{
>  		.name = "list",
> -		.read_seq_string = devcgroup_seq_read,
> +		.seq_show = devcgroup_seq_show,
>  		.private = DEVCG_LIST,
>  	},
>  	{ }	/* terminate */
> -- 
> 1.8.4.2
> 

-- 
Michal Hocko
SUSE Labs
_______________________________________________
Containers mailing list
Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/containers




[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux