All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mandeep Singh Baines <msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
To: Mandeep Singh Baines <msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
Cc: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Li Zefan <lizf-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>,
	Frederic Weisbecker
	<fweisbec-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
	cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	KAMEZAWA Hiroyuki
	<kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>,
	Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	Andrew Morton
	<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	Paul Menage <paul-inf54ven1CmVyaH7bEyXVA@public.gmane.org>
Subject: Re: [PATCH 2/3] cgroup: remove double-checking locking from attach_task_by_pid
Date: Thu, 22 Dec 2011 18:13:33 -0800	[thread overview]
Message-ID: <20111223021333.GM13529@google.com> (raw)
In-Reply-To: <1324601873-20773-2-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>

This is not going to work. Will fix up and resend. Need to goto
the top as suggested by Tejun.

Mandeep Singh Baines (msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org) wrote:
> By reading group_leader after taking the threadgroup_lock, we can
> avoid the double-check locking. This removes the return of
> -EAGAIN so we can cleanup cgroup_procs_write at the same time.
> 
> The suggestion was made here:
> 
> https://lkml.org/lkml/2011/12/22/371
> 
> Suggested-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> Signed-off-by: Mandeep Singh Baines <msb-F7+t8E8rja9g9hUCZPvPmw@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: Frederic Weisbecker <fweisbec-Re5JQEeQqe8AvxtiuMwx3w@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 |   40 ++++++----------------------------------
>  1 files changed, 6 insertions(+), 34 deletions(-)
> 
> diff --git a/kernel/cgroup.c b/kernel/cgroup.c
> index 032139d..a5f7d1b 100644
> --- a/kernel/cgroup.c
> +++ b/kernel/cgroup.c
> @@ -2234,9 +2234,6 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
>  			ret= -ESRCH;
>  			goto out_unlock_cgroup;
>  		}
> -		/* 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.
> @@ -2252,33 +2249,17 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
>  		get_task_struct(tsk);
>  		rcu_read_unlock();
>  	} else {
> -		if (threadgroup)
> -			tsk = current->group_leader;
> -		else
> -			tsk = current;
> +		tsk = current;
>  		get_task_struct(tsk);
>  	}
>  
>  	threadgroup_lock(tsk);
> -
> -	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
> +	if (threadgroup)
> +		ret = cgroup_attach_proc(cgrp, tsk->group_leader);
> +	else
>  		ret = cgroup_attach_task(cgrp, tsk);
> -
> -out_unlock_threadgroup:
>  	threadgroup_unlock(tsk);
> +
>  	put_task_struct(tsk);
>  out_unlock_cgroup:
>  	cgroup_unlock();
> @@ -2292,16 +2273,7 @@ static int cgroup_tasks_write(struct cgroup *cgrp, struct cftype *cft, u64 pid)
>  
>  static int cgroup_procs_write(struct cgroup *cgrp, struct cftype *cft, u64 tgid)
>  {
> -	int ret;
> -	do {
> -		/*
> -		 * attach_proc fails with -EAGAIN if threadgroup leadership
> -		 * changes in the middle of the operation, in which case we need
> -		 * to find the task_struct for the new leader and start over.
> -		 */
> -		ret = attach_task_by_pid(cgrp, tgid, true);
> -	} while (ret == -EAGAIN);
> -	return ret;
> +	return attach_task_by_pid(cgrp, tgid, true);
>  }
>  
>  /**
> -- 
> 1.7.3.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: Mandeep Singh Baines <msb@chromium.org>
To: Mandeep Singh Baines <msb@chromium.org>
Cc: Tejun Heo <tj@kernel.org>, Li Zefan <lizf@cn.fujitsu.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	linux-kernel@vger.kernel.org,
	containers@lists.linux-foundation.org, cgroups@vger.kernel.org,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Oleg Nesterov <oleg@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Paul Menage <paul@paulmenage.org>
Subject: Re: [PATCH 2/3] cgroup: remove double-checking locking from attach_task_by_pid
Date: Thu, 22 Dec 2011 18:13:33 -0800	[thread overview]
Message-ID: <20111223021333.GM13529@google.com> (raw)
In-Reply-To: <1324601873-20773-2-git-send-email-msb@chromium.org>

This is not going to work. Will fix up and resend. Need to goto
the top as suggested by Tejun.

Mandeep Singh Baines (msb@chromium.org) wrote:
> By reading group_leader after taking the threadgroup_lock, we can
> avoid the double-check locking. This removes the return of
> -EAGAIN so we can cleanup cgroup_procs_write at the same time.
> 
> The suggestion was made here:
> 
> https://lkml.org/lkml/2011/12/22/371
> 
> Suggested-by: Tejun Heo <tj@kernel.org>
> Signed-off-by: Mandeep Singh Baines <msb@chromium.org>
> Cc: Li Zefan <lizf@cn.fujitsu.com>
> Cc: containers@lists.linux-foundation.org
> Cc: cgroups@vger.kernel.org
> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Oleg Nesterov <oleg@redhat.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Paul Menage <paul@paulmenage.org>
> ---
>  kernel/cgroup.c |   40 ++++++----------------------------------
>  1 files changed, 6 insertions(+), 34 deletions(-)
> 
> diff --git a/kernel/cgroup.c b/kernel/cgroup.c
> index 032139d..a5f7d1b 100644
> --- a/kernel/cgroup.c
> +++ b/kernel/cgroup.c
> @@ -2234,9 +2234,6 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
>  			ret= -ESRCH;
>  			goto out_unlock_cgroup;
>  		}
> -		/* 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.
> @@ -2252,33 +2249,17 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
>  		get_task_struct(tsk);
>  		rcu_read_unlock();
>  	} else {
> -		if (threadgroup)
> -			tsk = current->group_leader;
> -		else
> -			tsk = current;
> +		tsk = current;
>  		get_task_struct(tsk);
>  	}
>  
>  	threadgroup_lock(tsk);
> -
> -	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
> +	if (threadgroup)
> +		ret = cgroup_attach_proc(cgrp, tsk->group_leader);
> +	else
>  		ret = cgroup_attach_task(cgrp, tsk);
> -
> -out_unlock_threadgroup:
>  	threadgroup_unlock(tsk);
> +
>  	put_task_struct(tsk);
>  out_unlock_cgroup:
>  	cgroup_unlock();
> @@ -2292,16 +2273,7 @@ static int cgroup_tasks_write(struct cgroup *cgrp, struct cftype *cft, u64 pid)
>  
>  static int cgroup_procs_write(struct cgroup *cgrp, struct cftype *cft, u64 tgid)
>  {
> -	int ret;
> -	do {
> -		/*
> -		 * attach_proc fails with -EAGAIN if threadgroup leadership
> -		 * changes in the middle of the operation, in which case we need
> -		 * to find the task_struct for the new leader and start over.
> -		 */
> -		ret = attach_task_by_pid(cgrp, tgid, true);
> -	} while (ret == -EAGAIN);
> -	return ret;
> +	return attach_task_by_pid(cgrp, tgid, true);
>  }
>  
>  /**
> -- 
> 1.7.3.1
> 

  parent reply	other threads:[~2011-12-23  2:13 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-23  0:57 [PATCH 1/3] cgroup: remove tasklist_lock from cgroup_attach_proc Mandeep Singh Baines
2011-12-23  0:57 ` Mandeep Singh Baines
2011-12-23  0:57 ` Mandeep Singh Baines
     [not found] ` <1324601873-20773-1-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2011-12-23  0:57   ` [PATCH 2/3] cgroup: remove double-checking locking from attach_task_by_pid Mandeep Singh Baines
2011-12-23  0:57     ` Mandeep Singh Baines
2011-12-23  0:57     ` Mandeep Singh Baines
     [not found]     ` <1324601873-20773-2-git-send-email-msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2011-12-23  2:13       ` Mandeep Singh Baines
2011-12-23  2:13       ` Mandeep Singh Baines [this message]
2011-12-23  2:13         ` Mandeep Singh Baines
2011-12-23  0:57   ` [PATCH 3/3] cgroup: remove extra calls to find_existing_css_set Mandeep Singh Baines
2011-12-23  0:57     ` Mandeep Singh Baines
2011-12-23  0:57     ` Mandeep Singh Baines
2011-12-23  2:27   ` [PATCH 1/3] cgroup: remove tasklist_lock from cgroup_attach_proc Frederic Weisbecker
2011-12-23  2:27   ` Frederic Weisbecker
2011-12-23  2:27     ` Frederic Weisbecker
     [not found]     ` <20111223022742.GA28309-oHC15RC7JGTpAmv0O++HtFaTQe2KTcn/@public.gmane.org>
2011-12-23  2:39       ` Frederic Weisbecker
2011-12-23  2:39       ` Frederic Weisbecker
2011-12-23  2:39         ` Frederic Weisbecker
2011-12-23  2:40       ` Li Zefan
2011-12-23  2:40         ` Li Zefan
     [not found]         ` <4EF3EA1C.4000806-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2011-12-23  2:41           ` Frederic Weisbecker
2011-12-23  2:41             ` Frederic Weisbecker
2011-12-23  2:41           ` Frederic Weisbecker
2011-12-23  2:40       ` Li Zefan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111223021333.GM13529@google.com \
    --to=msb-f7+t8e8rja9g9huczpvpmw@public.gmane.org \
    --cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
    --cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=fweisbec-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=lizf-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org \
    --cc=oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=paul-inf54ven1CmVyaH7bEyXVA@public.gmane.org \
    --cc=tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.