From 3e863a100508f15906b02868d58ffe3fc24bfc1a Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 18 Oct 2012 17:52:07 -0700 Subject: [PATCH] --- yaml --- r: 334799 b: refs/heads/master c: 9bb71308b8133d643648776243e4d5599b1c193d h: refs/heads/master i: 334797: d47e161016cf3bd21d6468b0dda3d02ba759ade2 334795: c4691aacb531215f8e85e5c51befe264b4cdc50d 334791: aa2d5f2c13134816d14927841c680ebd63f1fb6f 334783: 95c713b594169eb31ac93f95cfe2cfaffec4d224 v: v3 --- [refs] | 2 +- trunk/kernel/cgroup.c | 23 ++++++----------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/[refs] b/[refs] index 473454f79254..a9ba5db0be6b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1f5320d5972aa50d3e8d2b227b636b370e608359 +refs/heads/master: 9bb71308b8133d643648776243e4d5599b1c193d diff --git a/trunk/kernel/cgroup.c b/trunk/kernel/cgroup.c index d1739fc7eb94..75aec12c78a0 100644 --- a/trunk/kernel/cgroup.c +++ b/trunk/kernel/cgroup.c @@ -4814,31 +4814,20 @@ static const struct file_operations proc_cgroupstats_operations = { * * A pointer to the shared css_set was automatically copied in * fork.c by dup_task_struct(). However, we ignore that copy, since - * it was not made under the protection of RCU, cgroup_mutex or - * threadgroup_change_begin(), so it might no longer be a valid - * cgroup pointer. cgroup_attach_task() might have already changed - * current->cgroups, allowing the previously referenced cgroup - * group to be removed and freed. - * - * Outside the pointer validity we also need to process the css_set - * inheritance between threadgoup_change_begin() and - * threadgoup_change_end(), this way there is no leak in any process - * wide migration performed by cgroup_attach_proc() that could otherwise - * miss a thread because it is too early or too late in the fork stage. + * it was not made under the protection of RCU or cgroup_mutex, so + * might no longer be a valid cgroup pointer. cgroup_attach_task() might + * have already changed current->cgroups, allowing the previously + * referenced cgroup group to be removed and freed. * * At the point that cgroup_fork() is called, 'current' is the parent * task, and the passed argument 'child' points to the child task. */ void cgroup_fork(struct task_struct *child) { - /* - * We don't need to task_lock() current because current->cgroups - * can't be changed concurrently here. The parent obviously hasn't - * exited and called cgroup_exit(), and we are synchronized against - * cgroup migration through threadgroup_change_begin(). - */ + task_lock(current); child->cgroups = current->cgroups; get_css_set(child->cgroups); + task_unlock(current); INIT_LIST_HEAD(&child->cg_list); }