aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2012-10-18 20:40:30 -0400
committerTejun Heo <tj@kernel.org>2012-10-19 17:09:35 -0400
commitd87838321124061f6c935069d97f37010fa417e6 (patch)
tree825e291d0ad7bdc7e7eb68e4bb829121de2586bc /kernel
parent9bb71308b8133d643648776243e4d5599b1c193d (diff)
Revert "cgroup: Remove task_lock() from cgroup_post_fork()"
This reverts commit 7e3aa30ac8c904a706518b725c451bb486daaae9. The commit incorrectly assumed that fork path always performed threadgroup_change_begin/end() and depended on that for synchronization against task exit and cgroup migration paths instead of explicitly grabbing task_lock(). threadgroup_change is not locked when forking a new process (as opposed to a new thread in the same process) and even if it were it wouldn't be effective as different processes use different threadgroup locks. Revert the incorrect optimization. Signed-off-by: Tejun Heo <tj@kernel.org> LKML-Reference: <20121008020000.GB2575@localhost> Acked-by: Li Zefan <lizefan@huawei.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cgroup.c15
1 files changed, 3 insertions, 12 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 75aec12c78a0..f24f724620dd 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -4883,19 +4883,10 @@ void cgroup_post_fork(struct task_struct *child)
4883 */ 4883 */
4884 if (use_task_css_set_links) { 4884 if (use_task_css_set_links) {
4885 write_lock(&css_set_lock); 4885 write_lock(&css_set_lock);
4886 if (list_empty(&child->cg_list)) { 4886 task_lock(child);
4887 /* 4887 if (list_empty(&child->cg_list))
4888 * It's safe to use child->cgroups without task_lock()
4889 * here because we are protected through
4890 * threadgroup_change_begin() against concurrent
4891 * css_set change in cgroup_task_migrate(). Also
4892 * the task can't exit at that point until
4893 * wake_up_new_task() is called, so we are protected
4894 * against cgroup_exit() setting child->cgroup to
4895 * init_css_set.
4896 */
4897 list_add(&child->cg_list, &child->cgroups->tasks); 4888 list_add(&child->cg_list, &child->cgroups->tasks);
4898 } 4889 task_unlock(child);
4899 write_unlock(&css_set_lock); 4890 write_unlock(&css_set_lock);
4900 } 4891 }
4901} 4892}