Linux Container Development
 help / color / mirror / Atom feed
  • [parent not found: <1325654312-32477-2-git-send-email-msb@chromium.org>]
  • * [PATCH 1/3] cgroup: remove tasklist_lock from cgroup_attach_proc
    @ 2011-12-23  0:57 Mandeep Singh Baines
           [not found] ` <1324601873-20773-1-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
      0 siblings, 1 reply; 12+ messages in thread
    From: Mandeep Singh Baines @ 2011-12-23  0:57 UTC (permalink / raw)
      To: Li Zefan, Frederic Weisbecker,
    	linux-kernel-u79uwXL29TY76Z2rM5mHXA
      Cc: Mandeep Singh Baines, Oleg Nesterov, Paul Menage, Tejun Heo,
    	cgroups-u79uwXL29TY76Z2rM5mHXA, Andrew Morton,
    	containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA
    
    Since cgroup_attach_proc is protected by a threadgroup_lock, we
    no longer need a tasklist_lock to protect while_each_thread.
    To keep the complexity of the double-check locking in one place,
    I also moved the thread_group_leader check up into
    attach_task_by_pid.
    
    While at it, also converted a couple of returns to gotos.
    
    The suggestion was made here:
    
    https://lkml.org/lkml/2011/12/22/86
    
    Suggested-by: Frederic Weisbecker <fweisbec-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
    Signed-off-by: Mandeep Singh Baines <msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
    Cc: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
    Cc: Li Zefan <lizf-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
    Cc: containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
    Cc: cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
    Cc: Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
    Cc: Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
    Cc: Paul Menage <paul-inf54ven1CmVyaH7bEyXVA@public.gmane.org>
    ---
     kernel/cgroup.c |   52 +++++++++++++++++++++-------------------------------
     1 files changed, 21 insertions(+), 31 deletions(-)
    
    diff --git a/kernel/cgroup.c b/kernel/cgroup.c
    index 1042b3c..032139d 100644
    --- a/kernel/cgroup.c
    +++ b/kernel/cgroup.c
    @@ -2102,21 +2102,6 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader)
     	if (retval)
     		goto out_free_group_list;
     
    -	/* prevent changes to the threadgroup list while we take a snapshot. */
    -	read_lock(&tasklist_lock);
    -	if (!thread_group_leader(leader)) {
    -		/*
    -		 * a race with de_thread from another thread's exec() may strip
    -		 * us of our leadership, making while_each_thread unsafe to use
    -		 * on this task. if this happens, there is no choice but to
    -		 * throw this task away and try again (from cgroup_procs_write);
    -		 * this is "double-double-toil-and-trouble-check locking".
    -		 */
    -		read_unlock(&tasklist_lock);
    -		retval = -EAGAIN;
    -		goto out_free_group_list;
    -	}
    -
     	tsk = leader;
     	i = 0;
     	do {
    @@ -2145,7 +2130,6 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader)
     	group_size = i;
     	tset.tc_array = group;
     	tset.tc_array_len = group_size;
    -	read_unlock(&tasklist_lock);
     
     	/* methods shouldn't be called if no task is actually migrating */
     	retval = 0;
    @@ -2247,18 +2231,12 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
     		tsk = find_task_by_vpid(pid);
     		if (!tsk) {
     			rcu_read_unlock();
    -			cgroup_unlock();
    -			return -ESRCH;
    +			ret= -ESRCH;
    +			goto out_unlock_cgroup;
     		}
    -		if (threadgroup) {
    -			/*
    -			 * RCU protects this access, since tsk was found in the
    -			 * tid map. a race with de_thread may cause group_leader
    -			 * to stop being the leader, but cgroup_attach_proc will
    -			 * detect it later.
    -			 */
    +		/* we check later for a group_leader race with de_thread */
    +		if (threadgroup)
     			tsk = tsk->group_leader;
    -		}
     		/*
     		 * even if we're attaching all tasks in the thread group, we
     		 * only need to check permissions on one of them.
    @@ -2268,8 +2246,8 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
     		    cred->euid != tcred->uid &&
     		    cred->euid != tcred->suid) {
     			rcu_read_unlock();
    -			cgroup_unlock();
    -			return -EACCES;
    +			ret = -EACCES;
    +			goto out_unlock_cgroup;
     		}
     		get_task_struct(tsk);
     		rcu_read_unlock();
    @@ -2283,14 +2261,26 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
     
     	threadgroup_lock(tsk);
     
    -	if (threadgroup)
    +	if (threadgroup) {
    +		if (!thread_group_leader(tsk)) {
    +			/*
    +			 * a race with de_thread from another thread's exec()
    +			 * may strip us of our leadership, if this happens,
    +			 * there is no choice but to throw this task away and
    +			 * try again (from cgroup_procs_write); this is
    +			 * "double-double-toil-and-trouble-check locking".
    +			 */
    +			ret = -EAGAIN;
    +			goto out_unlock_threadgroup;
    +		}
     		ret = cgroup_attach_proc(cgrp, tsk);
    -	else
    +	} else
     		ret = cgroup_attach_task(cgrp, tsk);
     
    +out_unlock_threadgroup:
     	threadgroup_unlock(tsk);
    -
     	put_task_struct(tsk);
    +out_unlock_cgroup:
     	cgroup_unlock();
     	return ret;
     }
    -- 
    1.7.3.1
    
    ^ permalink raw reply related	[flat|nested] 12+ messages in thread

    end of thread, other threads:[~2012-01-21  5:52 UTC | newest]
    
    Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <1325654312-32477-1-git-send-email-msb@chromium.org>
         [not found] ` <1325654312-32477-1-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
    2012-01-04  5:18   ` [PATCH 2/3] cgroup: replace tasklist_lock with rcu_read_lock Mandeep Singh Baines
    2012-01-04  5:18   ` [PATCH 3/3] cgroup: remove extra calls to find_existing_css_set Mandeep Singh Baines
         [not found]     ` <1325654312-32477-3-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
    2012-01-05  2:10       ` Li Zefan
    2012-01-21  0:08       ` Tejun Heo
         [not found]     ` <4F0506B1.1070909@cn.fujitsu.com>
         [not found]       ` <4F0506B1.1070909-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
    2012-01-05 17:35         ` Tejun Heo
         [not found]     ` <20120121000842.GB2908@dhcp-172-17-108-109.mtv.corp.google.com>
         [not found]       ` <20120121000842.GB2908-RcKxWJ4Cfj1J2suj2OqeGauc2jM2gXBXkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
    2012-01-21  2:57         ` Mandeep Singh Baines
         [not found]           ` <20120121025712.GB4656-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
    2012-01-21  5:52             ` Tejun Heo
    2012-01-05  2:08   ` [PATCH 1/3] cgroup: simplify double-check locking in cgroup_attach_proc Li Zefan
         [not found] ` <1325654312-32477-2-git-send-email-msb@chromium.org>
         [not found]   ` <1325654312-32477-2-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
    2012-01-04 10:38     ` [PATCH 2/3] cgroup: replace tasklist_lock with rcu_read_lock Frederic Weisbecker
    2012-01-05  2:09     ` Li Zefan
    2012-01-21  0:00     ` Tejun Heo
    2011-12-23  0:57 [PATCH 1/3] cgroup: remove tasklist_lock from cgroup_attach_proc Mandeep Singh Baines
         [not found] ` <1324601873-20773-1-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
    2011-12-23  0:57   ` [PATCH 3/3] cgroup: remove extra calls to find_existing_css_set Mandeep Singh Baines
    

    This is a public inbox, see mirroring instructions
    for how to clone and mirror all data and code used for this inbox