Re: [PATCH cgroup/for-3.7-fixes 1/2] Revert "cgroup: Remove task_lock() from cgroup_post_fork()"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2012/10/18 Tejun Heo <tj@xxxxxxxxxx>:
> From d935a5d6832a264ce52f4257e176f4f96cbaf048 Mon Sep 17 00:00:00 2001
> From: Tejun Heo <tj@xxxxxxxxxx>
> Date: Thu, 18 Oct 2012 17:40:30 -0700
>
> 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.

Ok but there is still no good reason to task_lock() there. But the
comment is indeed wrong,  how about fixing it instead? I can send you
a patch for that.

>
> Signed-off-by: Tejun Heo <tj@xxxxxxxxxx>
> LKML-Reference: <20121008020000.GB2575@localhost>
> Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx>
> Cc: Li Zefan <lizefan@xxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
> ---
>  kernel/cgroup.c |   15 +++------------
>  1 files changed, 3 insertions(+), 12 deletions(-)
>
> diff --git a/kernel/cgroup.c b/kernel/cgroup.c
> index d1739fc..2990dc7 100644
> --- a/kernel/cgroup.c
> +++ b/kernel/cgroup.c
> @@ -4894,19 +4894,10 @@ void cgroup_post_fork(struct task_struct *child)
>          */
>         if (use_task_css_set_links) {
>                 write_lock(&css_set_lock);
> -               if (list_empty(&child->cg_list)) {
> -                       /*
> -                        * It's safe to use child->cgroups without task_lock()
> -                        * here because we are protected through
> -                        * threadgroup_change_begin() against concurrent
> -                        * css_set change in cgroup_task_migrate(). Also
> -                        * the task can't exit at that point until
> -                        * wake_up_new_task() is called, so we are protected
> -                        * against cgroup_exit() setting child->cgroup to
> -                        * init_css_set.
> -                        */
> +               task_lock(child);
> +               if (list_empty(&child->cg_list))
>                         list_add(&child->cg_list, &child->cgroups->tasks);
> -               }
> +               task_unlock(child);
>                 write_unlock(&css_set_lock);
>         }
>  }
> --
> 1.7.7.3
>
_______________________________________________
Containers mailing list
Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/containers


[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux