Commit 35ef10da authored by Tejun Heo's avatar Tejun Heo

cgroup: rename cgroup_subsys_state->dput_work and its callback function

css (cgroup_subsys_state) will become RCU protected and there will be
two stages which require punting to work item during release.  To
prepare for using the work item for multiple times, rename
css->dput_work to css->destroy_work and css_dput_fn() to
css_free_work_fn() and move work item initialization from css init to
right before the actual usage.

This reorganization doesn't introduce any behavior change.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
parent 40e93b39
...@@ -80,7 +80,7 @@ struct cgroup_subsys_state { ...@@ -80,7 +80,7 @@ struct cgroup_subsys_state {
struct css_id __rcu *id; struct css_id __rcu *id;
/* Used to put @cgroup->dentry on the last css_put() */ /* Used to put @cgroup->dentry on the last css_put() */
struct work_struct dput_work; struct work_struct destroy_work;
}; };
/* bits in struct cgroup_subsys_state flags field */ /* bits in struct cgroup_subsys_state flags field */
......
...@@ -4259,10 +4259,10 @@ static int cgroup_populate_dir(struct cgroup *cgrp, unsigned long subsys_mask) ...@@ -4259,10 +4259,10 @@ static int cgroup_populate_dir(struct cgroup *cgrp, unsigned long subsys_mask)
return ret; return ret;
} }
static void css_dput_fn(struct work_struct *work) static void css_free_work_fn(struct work_struct *work)
{ {
struct cgroup_subsys_state *css = struct cgroup_subsys_state *css =
container_of(work, struct cgroup_subsys_state, dput_work); container_of(work, struct cgroup_subsys_state, destroy_work);
cgroup_dput(css->cgroup); cgroup_dput(css->cgroup);
} }
...@@ -4272,7 +4272,14 @@ static void css_release(struct percpu_ref *ref) ...@@ -4272,7 +4272,14 @@ static void css_release(struct percpu_ref *ref)
struct cgroup_subsys_state *css = struct cgroup_subsys_state *css =
container_of(ref, struct cgroup_subsys_state, refcnt); container_of(ref, struct cgroup_subsys_state, refcnt);
schedule_work(&css->dput_work); /*
* css holds an extra ref to @cgrp->dentry which is put on the last
* css_put(). dput() requires process context, which css_put() may
* be called without. @css->destroy_work will be used to invoke
* dput() asynchronously from css_put().
*/
INIT_WORK(&css->destroy_work, css_free_work_fn);
schedule_work(&css->destroy_work);
} }
static void init_cgroup_css(struct cgroup_subsys_state *css, static void init_cgroup_css(struct cgroup_subsys_state *css,
...@@ -4287,14 +4294,6 @@ static void init_cgroup_css(struct cgroup_subsys_state *css, ...@@ -4287,14 +4294,6 @@ static void init_cgroup_css(struct cgroup_subsys_state *css,
css->flags |= CSS_ROOT; css->flags |= CSS_ROOT;
BUG_ON(cgroup_css(cgrp, ss->subsys_id)); BUG_ON(cgroup_css(cgrp, ss->subsys_id));
cgrp->subsys[ss->subsys_id] = css; cgrp->subsys[ss->subsys_id] = css;
/*
* css holds an extra ref to @cgrp->dentry which is put on the last
* css_put(). dput() requires process context, which css_put() may
* be called without. @css->dput_work will be used to invoke
* dput() asynchronously from css_put().
*/
INIT_WORK(&css->dput_work, css_dput_fn);
} }
/* invoke ->css_online() on a new CSS and mark it online if successful */ /* invoke ->css_online() on a new CSS and mark it online if successful */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment