Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 182446d0 authored by Tejun Heo's avatar Tejun Heo
Browse files

cgroup: pass around cgroup_subsys_state instead of cgroup in file methods



cgroup is currently in the process of transitioning to using struct
cgroup_subsys_state * as the primary handle instead of struct cgroup.
Please see the previous commit which converts the subsystem methods
for rationale.

This patch converts all cftype file operations to take @css instead of
@cgroup.  cftypes for the cgroup core files don't have their subsytem
pointer set.  These will automatically use the dummy_css added by the
previous patch and can be converted the same way.

Most subsystem conversions are straight forwards but there are some
interesting ones.

* freezer: update_if_frozen() is also converted to take @css instead
  of @cgroup for consistency.  This will make the code look simpler
  too once iterators are converted to use css.

* memory/vmpressure: mem_cgroup_from_css() needs to be exported to
  vmpressure while mem_cgroup_from_cont() can be made static.
  Updated accordingly.

* cpu: cgroup_tg() doesn't have any user left.  Removed.

* cpuacct: cgroup_ca() doesn't have any user left.  Removed.

* hugetlb: hugetlb_cgroup_form_cgroup() doesn't have any user left.
  Removed.

* net_cls: cgrp_cls_state() doesn't have any user left.  Removed.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
Acked-by: default avatarVivek Goyal <vgoyal@redhat.com>
Acked-by: default avatarAristeu Rozanski <aris@redhat.com>
Acked-by: default avatarDaniel Wagner <daniel.wagner@bmw-carit.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Balbir Singh <bsingharora@gmail.com>
Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Steven Rostedt <rostedt@goodmis.org>
parent 67f4c36f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -437,10 +437,10 @@ struct request_list *__blk_queue_next_rl(struct request_list *rl,
	return &blkg->rl;
}

static int blkcg_reset_stats(struct cgroup *cgroup, struct cftype *cftype,
			     u64 val)
static int blkcg_reset_stats(struct cgroup_subsys_state *css,
			     struct cftype *cftype, u64 val)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgroup);
	struct blkcg *blkcg = css_to_blkcg(css);
	struct blkcg_gq *blkg;
	int i;

+16 −16
Original line number Diff line number Diff line
@@ -1293,10 +1293,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 *cgrp, struct cftype *cft,
			       struct seq_file *sf)
static int tg_print_cpu_rwstat(struct cgroup_subsys_state *css,
			       struct cftype *cft, struct seq_file *sf)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);

	blkcg_print_blkgs(sf, blkcg, tg_prfill_cpu_rwstat, &blkcg_policy_throtl,
			  cft->private, true);
@@ -1325,26 +1325,26 @@ 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 *cgrp, struct cftype *cft,
			     struct seq_file *sf)
static int tg_print_conf_u64(struct cgroup_subsys_state *css,
			     struct cftype *cft, struct seq_file *sf)
{
	blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp), tg_prfill_conf_u64,
	blkcg_print_blkgs(sf, css_to_blkcg(css), tg_prfill_conf_u64,
			  &blkcg_policy_throtl, cft->private, false);
	return 0;
}

static int tg_print_conf_uint(struct cgroup *cgrp, struct cftype *cft,
			      struct seq_file *sf)
static int tg_print_conf_uint(struct cgroup_subsys_state *css,
			      struct cftype *cft, struct seq_file *sf)
{
	blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp), tg_prfill_conf_uint,
	blkcg_print_blkgs(sf, css_to_blkcg(css), tg_prfill_conf_uint,
			  &blkcg_policy_throtl, cft->private, false);
	return 0;
}

static int tg_set_conf(struct cgroup *cgrp, struct cftype *cft, const char *buf,
		       bool is_u64)
static int tg_set_conf(struct cgroup_subsys_state *css, struct cftype *cft,
		       const char *buf, bool is_u64)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);
	struct blkg_conf_ctx ctx;
	struct throtl_grp *tg;
	struct throtl_service_queue *sq;
@@ -1403,16 +1403,16 @@ static int tg_set_conf(struct cgroup *cgrp, struct cftype *cft, const char *buf,
	return 0;
}

static int tg_set_conf_u64(struct cgroup *cgrp, struct cftype *cft,
static int tg_set_conf_u64(struct cgroup_subsys_state *css, struct cftype *cft,
			   const char *buf)
{
	return tg_set_conf(cgrp, cft, buf, true);
	return tg_set_conf(css, cft, buf, true);
}

static int tg_set_conf_uint(struct cgroup *cgrp, struct cftype *cft,
static int tg_set_conf_uint(struct cgroup_subsys_state *css, struct cftype *cft,
			    const char *buf)
{
	return tg_set_conf(cgrp, cft, buf, false);
	return tg_set_conf(css, cft, buf, false);
}

static struct cftype throtl_files[] = {
+45 −45
Original line number Diff line number Diff line
@@ -1607,12 +1607,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 *cgrp, struct cftype *cft,
				    struct seq_file *sf)
static int cfqg_print_weight_device(struct cgroup_subsys_state *css,
				    struct cftype *cft, struct seq_file *sf)
{
	blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp),
			  cfqg_prfill_weight_device, &blkcg_policy_cfq, 0,
			  false);
	blkcg_print_blkgs(sf, css_to_blkcg(css), cfqg_prfill_weight_device,
			  &blkcg_policy_cfq, 0, false);
	return 0;
}

@@ -1626,35 +1625,34 @@ 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 *cgrp,
static int cfqg_print_leaf_weight_device(struct cgroup_subsys_state *css,
					 struct cftype *cft,
					 struct seq_file *sf)
{
	blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp),
			  cfqg_prfill_leaf_weight_device, &blkcg_policy_cfq, 0,
			  false);
	blkcg_print_blkgs(sf, css_to_blkcg(css), cfqg_prfill_leaf_weight_device,
			  &blkcg_policy_cfq, 0, false);
	return 0;
}

static int cfq_print_weight(struct cgroup *cgrp, struct cftype *cft,
static int cfq_print_weight(struct cgroup_subsys_state *css, struct cftype *cft,
			    struct seq_file *sf)
{
	seq_printf(sf, "%u\n", cgroup_to_blkcg(cgrp)->cfq_weight);
	seq_printf(sf, "%u\n", css_to_blkcg(css)->cfq_weight);
	return 0;
}

static int cfq_print_leaf_weight(struct cgroup *cgrp, struct cftype *cft,
				 struct seq_file *sf)
static int cfq_print_leaf_weight(struct cgroup_subsys_state *css,
				 struct cftype *cft, struct seq_file *sf)
{
	seq_printf(sf, "%u\n",
		   cgroup_to_blkcg(cgrp)->cfq_leaf_weight);
	seq_printf(sf, "%u\n", css_to_blkcg(css)->cfq_leaf_weight);
	return 0;
}

static int __cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft,
				    const char *buf, bool is_leaf_weight)
static int __cfqg_set_weight_device(struct cgroup_subsys_state *css,
				    struct cftype *cft, const char *buf,
				    bool is_leaf_weight)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);
	struct blkg_conf_ctx ctx;
	struct cfq_group *cfqg;
	int ret;
@@ -1680,22 +1678,22 @@ static int __cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft,
	return ret;
}

static int cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft,
				  const char *buf)
static int cfqg_set_weight_device(struct cgroup_subsys_state *css,
				  struct cftype *cft, const char *buf)
{
	return __cfqg_set_weight_device(cgrp, cft, buf, false);
	return __cfqg_set_weight_device(css, cft, buf, false);
}

static int cfqg_set_leaf_weight_device(struct cgroup *cgrp, struct cftype *cft,
				       const char *buf)
static int cfqg_set_leaf_weight_device(struct cgroup_subsys_state *css,
				       struct cftype *cft, const char *buf)
{
	return __cfqg_set_weight_device(cgrp, cft, buf, true);
	return __cfqg_set_weight_device(css, cft, buf, true);
}

static int __cfq_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val,
			    bool is_leaf_weight)
static int __cfq_set_weight(struct cgroup_subsys_state *css, struct cftype *cft,
			    u64 val, bool is_leaf_weight)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);
	struct blkcg_gq *blkg;

	if (val < CFQ_WEIGHT_MIN || val > CFQ_WEIGHT_MAX)
@@ -1727,30 +1725,32 @@ static int __cfq_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val,
	return 0;
}

static int cfq_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val)
static int cfq_set_weight(struct cgroup_subsys_state *css, struct cftype *cft,
			  u64 val)
{
	return __cfq_set_weight(cgrp, cft, val, false);
	return __cfq_set_weight(css, cft, val, false);
}

static int cfq_set_leaf_weight(struct cgroup *cgrp, struct cftype *cft, u64 val)
static int cfq_set_leaf_weight(struct cgroup_subsys_state *css,
			       struct cftype *cft, u64 val)
{
	return __cfq_set_weight(cgrp, cft, val, true);
	return __cfq_set_weight(css, cft, val, true);
}

static int cfqg_print_stat(struct cgroup *cgrp, struct cftype *cft,
static int cfqg_print_stat(struct cgroup_subsys_state *css, struct cftype *cft,
			   struct seq_file *sf)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);

	blkcg_print_blkgs(sf, blkcg, blkg_prfill_stat, &blkcg_policy_cfq,
			  cft->private, false);
	return 0;
}

static int cfqg_print_rwstat(struct cgroup *cgrp, struct cftype *cft,
			     struct seq_file *sf)
static int cfqg_print_rwstat(struct cgroup_subsys_state *css,
			     struct cftype *cft, struct seq_file *sf)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);

	blkcg_print_blkgs(sf, blkcg, blkg_prfill_rwstat, &blkcg_policy_cfq,
			  cft->private, true);
@@ -1773,20 +1773,20 @@ 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 *cgrp, struct cftype *cft,
				     struct seq_file *sf)
static int cfqg_print_stat_recursive(struct cgroup_subsys_state *css,
				     struct cftype *cft, struct seq_file *sf)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);

	blkcg_print_blkgs(sf, blkcg, cfqg_prfill_stat_recursive,
			  &blkcg_policy_cfq, cft->private, false);
	return 0;
}

static int cfqg_print_rwstat_recursive(struct cgroup *cgrp, struct cftype *cft,
				       struct seq_file *sf)
static int cfqg_print_rwstat_recursive(struct cgroup_subsys_state *css,
				       struct cftype *cft, struct seq_file *sf)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);

	blkcg_print_blkgs(sf, blkcg, cfqg_prfill_rwstat_recursive,
			  &blkcg_policy_cfq, cft->private, true);
@@ -1810,10 +1810,10 @@ static u64 cfqg_prfill_avg_queue_size(struct seq_file *sf,
}

/* print avg_queue_size */
static int cfqg_print_avg_queue_size(struct cgroup *cgrp, struct cftype *cft,
				     struct seq_file *sf)
static int cfqg_print_avg_queue_size(struct cgroup_subsys_state *css,
				     struct cftype *cft, struct seq_file *sf)
{
	struct blkcg *blkcg = cgroup_to_blkcg(cgrp);
	struct blkcg *blkcg = css_to_blkcg(css);

	blkcg_print_blkgs(sf, blkcg, cfqg_prfill_avg_queue_size,
			  &blkcg_policy_cfq, 0, false);
+13 −11
Original line number Diff line number Diff line
@@ -439,34 +439,34 @@ struct cftype {
	struct cgroup_subsys *ss;

	int (*open)(struct inode *inode, struct file *file);
	ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,
	ssize_t (*read)(struct cgroup_subsys_state *css, struct cftype *cft,
			struct file *file,
			char __user *buf, size_t nbytes, loff_t *ppos);
	/*
	 * read_u64() is a shortcut for the common case of returning a
	 * single integer. Use it in place of read()
	 */
	u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft);
	u64 (*read_u64)(struct cgroup_subsys_state *css, struct cftype *cft);
	/*
	 * read_s64() is a signed version of read_u64()
	 */
	s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft);
	s64 (*read_s64)(struct cgroup_subsys_state *css, struct cftype *cft);
	/*
	 * read_map() is used for defining a map of key/value
	 * pairs. It should call cb->fill(cb, key, value) for each
	 * entry. The key/value pairs (and their ordering) should not
	 * change between reboots.
	 */
	int (*read_map)(struct cgroup *cgrp, struct cftype *cft,
	int (*read_map)(struct cgroup_subsys_state *css, struct cftype *cft,
			struct cgroup_map_cb *cb);
	/*
	 * read_seq_string() is used for outputting a simple sequence
	 * using seqfile.
	 */
	int (*read_seq_string)(struct cgroup *cgrp, struct cftype *cft,
			       struct seq_file *m);
	int (*read_seq_string)(struct cgroup_subsys_state *css,
			       struct cftype *cft, struct seq_file *m);

	ssize_t (*write)(struct cgroup *cgrp, struct cftype *cft,
	ssize_t (*write)(struct cgroup_subsys_state *css, struct cftype *cft,
			 struct file *file,
			 const char __user *buf, size_t nbytes, loff_t *ppos);

@@ -475,18 +475,20 @@ struct cftype {
	 * a single integer (as parsed by simple_strtoull) from
	 * userspace. Use in place of write(); return 0 or error.
	 */
	int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val);
	int (*write_u64)(struct cgroup_subsys_state *css, struct cftype *cft,
			 u64 val);
	/*
	 * write_s64() is a signed version of write_u64()
	 */
	int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val);
	int (*write_s64)(struct cgroup_subsys_state *css, struct cftype *cft,
			 s64 val);

	/*
	 * write_string() is passed a nul-terminated kernelspace
	 * buffer of maximum length determined by max_write_len.
	 * Returns 0 or -ve error code.
	 */
	int (*write_string)(struct cgroup *cgrp, struct cftype *cft,
	int (*write_string)(struct cgroup_subsys_state *css, struct cftype *cft,
			    const char *buffer);
	/*
	 * trigger() callback can be used to get some kick from the
@@ -494,7 +496,7 @@ struct cftype {
	 * at all. The private field can be used to determine the
	 * kick type for multiplexing.
	 */
	int (*trigger)(struct cgroup *cgrp, unsigned int event);
	int (*trigger)(struct cgroup_subsys_state *css, unsigned int event);

	int (*release)(struct inode *inode, struct file *file);

+1 −1
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
extern struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm);

extern struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *memcg);
extern struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont);
extern struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *css);

static inline
bool mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *memcg)
Loading