cgroup: update init_css() into init_and_link_css()

init_css() takes the cgroup the new css belongs to as an argument and
initializes the new css's ->cgroup and ->parent pointers but doesn't
acquire the matching reference counts.  After the previous patch,
create_css() puts init_css() and reference acquisition right next to
each other.  Let's move reference acquistion into init_css() and
rename the function to init_and_link_css().  This makes sense and is
easier to follow.  This makes the root csses to hold a reference on
cgrp_dfl_root.cgrp, which is harmless.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
This commit is contained in:
Tejun Heo 2014-05-04 15:09:14 -04:00
parent a2bed8209a
commit ddfcadab35

View File

@ -4109,17 +4109,21 @@ static void css_release(struct percpu_ref *ref)
call_rcu(&css->rcu_head, css_free_rcu_fn); call_rcu(&css->rcu_head, css_free_rcu_fn);
} }
static void init_css(struct cgroup_subsys_state *css, struct cgroup_subsys *ss, static void init_and_link_css(struct cgroup_subsys_state *css,
struct cgroup *cgrp) struct cgroup_subsys *ss, struct cgroup *cgrp)
{ {
cgroup_get(cgrp);
css->cgroup = cgrp; css->cgroup = cgrp;
css->ss = ss; css->ss = ss;
css->flags = 0; css->flags = 0;
if (cgrp->parent) if (cgrp->parent) {
css->parent = cgroup_css(cgrp->parent, ss); css->parent = cgroup_css(cgrp->parent, ss);
else css_get(css->parent);
} else {
css->flags |= CSS_ROOT; css->flags |= CSS_ROOT;
}
BUG_ON(cgroup_css(cgrp, ss)); BUG_ON(cgroup_css(cgrp, ss));
} }
@ -4185,9 +4189,7 @@ static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss)
if (IS_ERR(css)) if (IS_ERR(css))
return PTR_ERR(css); return PTR_ERR(css);
init_css(css, ss, cgrp); init_and_link_css(css, ss, cgrp);
cgroup_get(cgrp);
css_get(css->parent);
err = percpu_ref_init(&css->refcnt, css_release); err = percpu_ref_init(&css->refcnt, css_release);
if (err) if (err)
@ -4656,7 +4658,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss)
css = ss->css_alloc(cgroup_css(&cgrp_dfl_root.cgrp, ss)); css = ss->css_alloc(cgroup_css(&cgrp_dfl_root.cgrp, ss));
/* We don't handle early failures gracefully */ /* We don't handle early failures gracefully */
BUG_ON(IS_ERR(css)); BUG_ON(IS_ERR(css));
init_css(css, ss, &cgrp_dfl_root.cgrp); init_and_link_css(css, ss, &cgrp_dfl_root.cgrp);
/* Update the init_css_set to contain a subsys /* Update the init_css_set to contain a subsys
* pointer to this state - since the subsystem is * pointer to this state - since the subsystem is