Commit 223dbc38 authored by Tejun Heo's avatar Tejun Heo

cgroup: bounce cgroup_subsys_state ref kill confirmation to a work item

css (cgroup_subsys_state) offlining, which requires process context,
will be moved to ref kill confirmation.  In preparation, bounce
css_killed handling through css->destroy_work.

css_ref_killed_fn() is renamed to css_killed_ref_fn() so that it's
consistent with the new css_killed_work_fn().

This patch adds an additional work item bouncing but doesn't change
the actual logic.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
parent ae7f164a
...@@ -4555,12 +4555,27 @@ static void cgroup_css_killed(struct cgroup *cgrp) ...@@ -4555,12 +4555,27 @@ static void cgroup_css_killed(struct cgroup *cgrp)
schedule_work(&cgrp->destroy_work); schedule_work(&cgrp->destroy_work);
} }
static void css_ref_killed_fn(struct percpu_ref *ref) /*
* This is called when the refcnt of a css is confirmed to be killed.
* css_tryget() is now guaranteed to fail.
*/
static void css_killed_work_fn(struct work_struct *work)
{
struct cgroup_subsys_state *css =
container_of(work, struct cgroup_subsys_state, destroy_work);
struct cgroup *cgrp = css->cgroup;
cgroup_css_killed(cgrp);
}
/* css kill confirmation processing requires process context, bounce */
static void css_killed_ref_fn(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);
cgroup_css_killed(css->cgroup); INIT_WORK(&css->destroy_work, css_killed_work_fn);
schedule_work(&css->destroy_work);
} }
/** /**
...@@ -4634,7 +4649,7 @@ static int cgroup_destroy_locked(struct cgroup *cgrp) ...@@ -4634,7 +4649,7 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
percpu_ref_get(&css->refcnt); percpu_ref_get(&css->refcnt);
atomic_inc(&cgrp->css_kill_cnt); atomic_inc(&cgrp->css_kill_cnt);
percpu_ref_kill_and_confirm(&css->refcnt, css_ref_killed_fn); percpu_ref_kill_and_confirm(&css->refcnt, css_killed_ref_fn);
} }
cgroup_css_killed(cgrp); cgroup_css_killed(cgrp);
......
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