cgroup: bounce cgroup_subsys_state ref kill confirmation to a work item
authorTejun Heo <tj@kernel.org>
Wed, 14 Aug 2013 00:22:50 +0000 (20:22 -0400)
committerTejun Heo <tj@kernel.org>
Wed, 14 Aug 2013 00:22:50 +0000 (20:22 -0400)
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: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
kernel/cgroup.c

index b9f736c..398ffbb 100644 (file)
@@ -4555,12 +4555,27 @@ static void cgroup_css_killed(struct cgroup *cgrp)
        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 =
                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)
                percpu_ref_get(&css->refcnt);
 
                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);