public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
@ 2010-08-30 17:26 Paul E. McKenney
  2010-08-30 19:51 ` Jiri Slaby
  2010-08-31 13:02 ` David Howells
  0 siblings, 2 replies; 9+ messages in thread
From: Paul E. McKenney @ 2010-08-30 17:26 UTC (permalink / raw)
  To: linux-kernel
  Cc: mingo, laijs, dipankar, akpm, mathieu.desnoyers, josh, dvhltc,
	niv, tglx, peterz, rostedt, Valdis.Kletnieks, dhowells,
	eric.dumazet, jslaby, jmorris

[   23.584719]
[   23.584720] ===================================================
[   23.585059] [ INFO: suspicious rcu_dereference_check() usage. ]
[   23.585176] ---------------------------------------------------
[   23.585176] kernel/pid.c:419 invoked rcu_dereference_check() without protection!
[   23.585176]
[   23.585176] other info that might help us debug this:
[   23.585176]
[   23.585176]
[   23.585176] rcu_scheduler_active = 1, debug_locks = 1
[   23.585176] 1 lock held by rc.sysinit/728:
[   23.585176]  #0:  (tasklist_lock){.+.+..}, at: [<ffffffff8104771f>] sys_setpgid+0x5f/0x193
[   23.585176]
[   23.585176] stack backtrace:
[   23.585176] Pid: 728, comm: rc.sysinit Not tainted 2.6.36-rc2 #2
[   23.585176] Call Trace:
[   23.585176]  [<ffffffff8105b436>] lockdep_rcu_dereference+0x99/0xa2
[   23.585176]  [<ffffffff8104c324>] find_task_by_pid_ns+0x50/0x6a
[   23.585176]  [<ffffffff8104c35b>] find_task_by_vpid+0x1d/0x1f
[   23.585176]  [<ffffffff81047727>] sys_setpgid+0x67/0x193
[   23.585176]  [<ffffffff810029eb>] system_call_fastpath+0x16/0x1b
[   24.959669] type=1400 audit(1282938522.956:4): avc:  denied  { module_request } for  pid=766 comm="hwclock" kmod="char-major-10-135" scontext=system_u:system_r:hwclock_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclas

It turns out that the setpgid() system call fails to enter an RCU
read-side critical section before doing a PID-to-task_struct translation.
This commit therefore does rcu_read_lock() before the translation, and
also does rcu_read_unlock() after the last use of the returned pointer.

Located-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---

 sys.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/sys.c b/kernel/sys.c
index e9ad444..05a4b0c 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -938,6 +938,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
 	write_lock_irq(&tasklist_lock);
 
 	err = -ESRCH;
+	rcu_read_lock();
 	p = find_task_by_vpid(pid);
 	if (!p)
 		goto out;
@@ -983,6 +984,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
 	err = 0;
 out:
 	/* All paths lead to here, thus we are safe. -DaveM */
+	rcu_read_unlock();
 	write_unlock_irq(&tasklist_lock);
 	return err;
 }

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-08-30 17:26 [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section Paul E. McKenney
@ 2010-08-30 19:51 ` Jiri Slaby
  2010-08-30 20:32   ` Paul E. McKenney
  2010-09-09 22:15   ` Oleg Nesterov
  2010-08-31 13:02 ` David Howells
  1 sibling, 2 replies; 9+ messages in thread
From: Jiri Slaby @ 2010-08-30 19:51 UTC (permalink / raw)
  To: paulmck
  Cc: linux-kernel, mingo, laijs, dipankar, akpm, mathieu.desnoyers,
	josh, dvhltc, niv, tglx, peterz, rostedt, Valdis.Kletnieks,
	dhowells, eric.dumazet, jmorris, Oleg Nesterov

Ccing Oleg.

On 08/30/2010 07:26 PM, Paul E. McKenney wrote:
> [   23.584720] ===================================================
> [   23.585059] [ INFO: suspicious rcu_dereference_check() usage. ]
> [   23.585176] ---------------------------------------------------
> [   23.585176] kernel/pid.c:419 invoked rcu_dereference_check() without protection!
> [   23.585176]
> [   23.585176] other info that might help us debug this:
> [   23.585176]
> [   23.585176]
> [   23.585176] rcu_scheduler_active = 1, debug_locks = 1
> [   23.585176] 1 lock held by rc.sysinit/728:
> [   23.585176]  #0:  (tasklist_lock){.+.+..}, at: [<ffffffff8104771f>] sys_setpgid+0x5f/0x193
> [   23.585176]
> [   23.585176] stack backtrace:
> [   23.585176] Pid: 728, comm: rc.sysinit Not tainted 2.6.36-rc2 #2
> [   23.585176] Call Trace:
> [   23.585176]  [<ffffffff8105b436>] lockdep_rcu_dereference+0x99/0xa2
> [   23.585176]  [<ffffffff8104c324>] find_task_by_pid_ns+0x50/0x6a
> [   23.585176]  [<ffffffff8104c35b>] find_task_by_vpid+0x1d/0x1f
> [   23.585176]  [<ffffffff81047727>] sys_setpgid+0x67/0x193
> [   23.585176]  [<ffffffff810029eb>] system_call_fastpath+0x16/0x1b
> [   24.959669] type=1400 audit(1282938522.956:4): avc:  denied  { module_request } for  pid=766 comm="hwclock" kmod="char-major-10-135" scontext=system_u:system_r:hwclock_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclas
> 
> It turns out that the setpgid() system call fails to enter an RCU
> read-side critical section before doing a PID-to-task_struct translation.
> This commit therefore does rcu_read_lock() before the translation, and
> also does rcu_read_unlock() after the last use of the returned pointer.
> 
> Located-by: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> 
>  sys.c |    2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/kernel/sys.c b/kernel/sys.c
> index e9ad444..05a4b0c 100644
> --- a/kernel/sys.c
> +++ b/kernel/sys.c
> @@ -938,6 +938,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
>  	write_lock_irq(&tasklist_lock);
>  
>  	err = -ESRCH;
> +	rcu_read_lock();
>  	p = find_task_by_vpid(pid);

AFAICT the missing lock doesn't harm due to the write_lock of tasklist
above. But is probably a good thing to do anyway.

regards,
-- 
js
suse labs

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-08-30 19:51 ` Jiri Slaby
@ 2010-08-30 20:32   ` Paul E. McKenney
  2010-09-09 22:15   ` Oleg Nesterov
  1 sibling, 0 replies; 9+ messages in thread
From: Paul E. McKenney @ 2010-08-30 20:32 UTC (permalink / raw)
  To: Jiri Slaby
  Cc: linux-kernel, mingo, laijs, dipankar, akpm, mathieu.desnoyers,
	josh, dvhltc, niv, tglx, peterz, rostedt, Valdis.Kletnieks,
	dhowells, eric.dumazet, jmorris, Oleg Nesterov

On Mon, Aug 30, 2010 at 09:51:07PM +0200, Jiri Slaby wrote:
> Ccing Oleg.
> 
> On 08/30/2010 07:26 PM, Paul E. McKenney wrote:
> > [   23.584720] ===================================================
> > [   23.585059] [ INFO: suspicious rcu_dereference_check() usage. ]
> > [   23.585176] ---------------------------------------------------
> > [   23.585176] kernel/pid.c:419 invoked rcu_dereference_check() without protection!
> > [   23.585176]
> > [   23.585176] other info that might help us debug this:
> > [   23.585176]
> > [   23.585176]
> > [   23.585176] rcu_scheduler_active = 1, debug_locks = 1
> > [   23.585176] 1 lock held by rc.sysinit/728:
> > [   23.585176]  #0:  (tasklist_lock){.+.+..}, at: [<ffffffff8104771f>] sys_setpgid+0x5f/0x193
> > [   23.585176]
> > [   23.585176] stack backtrace:
> > [   23.585176] Pid: 728, comm: rc.sysinit Not tainted 2.6.36-rc2 #2
> > [   23.585176] Call Trace:
> > [   23.585176]  [<ffffffff8105b436>] lockdep_rcu_dereference+0x99/0xa2
> > [   23.585176]  [<ffffffff8104c324>] find_task_by_pid_ns+0x50/0x6a
> > [   23.585176]  [<ffffffff8104c35b>] find_task_by_vpid+0x1d/0x1f
> > [   23.585176]  [<ffffffff81047727>] sys_setpgid+0x67/0x193
> > [   23.585176]  [<ffffffff810029eb>] system_call_fastpath+0x16/0x1b
> > [   24.959669] type=1400 audit(1282938522.956:4): avc:  denied  { module_request } for  pid=766 comm="hwclock" kmod="char-major-10-135" scontext=system_u:system_r:hwclock_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclas
> > 
> > It turns out that the setpgid() system call fails to enter an RCU
> > read-side critical section before doing a PID-to-task_struct translation.
> > This commit therefore does rcu_read_lock() before the translation, and
> > also does rcu_read_unlock() after the last use of the returned pointer.
> > 
> > Located-by: Andrew Morton <akpm@linux-foundation.org>
> > Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> > ---
> > 
> >  sys.c |    2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/kernel/sys.c b/kernel/sys.c
> > index e9ad444..05a4b0c 100644
> > --- a/kernel/sys.c
> > +++ b/kernel/sys.c
> > @@ -938,6 +938,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
> >  	write_lock_irq(&tasklist_lock);
> >  
> >  	err = -ESRCH;
> > +	rcu_read_lock();
> >  	p = find_task_by_vpid(pid);
> 
> AFAICT the missing lock doesn't harm due to the write_lock of tasklist
> above. But is probably a good thing to do anyway.

Or we can add the tasklist lock to the rcu_dereference_check() condition.

							Thanx, Paul

> regards,
> -- 
> js
> suse labs
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-08-30 17:26 [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section Paul E. McKenney
  2010-08-30 19:51 ` Jiri Slaby
@ 2010-08-31 13:02 ` David Howells
  2010-08-31 15:12   ` Paul E. McKenney
  1 sibling, 1 reply; 9+ messages in thread
From: David Howells @ 2010-08-31 13:02 UTC (permalink / raw)
  To: paulmck
  Cc: dhowells, linux-kernel, mingo, laijs, dipankar, akpm,
	mathieu.desnoyers, josh, dvhltc, niv, tglx, peterz, rostedt,
	Valdis.Kletnieks, eric.dumazet, jslaby, jmorris

Paul E. McKenney <paulmck@linux.vnet.ibm.com> wrote:

>  	write_lock_irq(&tasklist_lock);
>  
>  	err = -ESRCH;
> +	rcu_read_lock();
> ...
> +	rcu_read_unlock();
>  	write_unlock_irq(&tasklist_lock);

I would generally put the rcu lock outside the IRQ disabled section on the
basis that it's better to keep the amount of time we have interrupts disabled
shortest.

> Located-by: Andrew Morton <akpm@linux-foundation.org>

'Reported-by' might be more consistent with what others use.

David

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-08-31 13:02 ` David Howells
@ 2010-08-31 15:12   ` Paul E. McKenney
  2010-08-31 15:31     ` David Howells
  0 siblings, 1 reply; 9+ messages in thread
From: Paul E. McKenney @ 2010-08-31 15:12 UTC (permalink / raw)
  To: David Howells
  Cc: linux-kernel, mingo, laijs, dipankar, akpm, mathieu.desnoyers,
	josh, dvhltc, niv, tglx, peterz, rostedt, Valdis.Kletnieks,
	eric.dumazet, jslaby, jmorris

On Tue, Aug 31, 2010 at 02:02:31PM +0100, David Howells wrote:
> Paul E. McKenney <paulmck@linux.vnet.ibm.com> wrote:
> 
> >  	write_lock_irq(&tasklist_lock);
> >  
> >  	err = -ESRCH;
> > +	rcu_read_lock();
> > ...
> > +	rcu_read_unlock();
> >  	write_unlock_irq(&tasklist_lock);
> 
> I would generally put the rcu lock outside the IRQ disabled section on the
> basis that it's better to keep the amount of time we have interrupts disabled
> shortest.
> 
> > Located-by: Andrew Morton <akpm@linux-foundation.org>
> 
> 'Reported-by' might be more consistent with what others use.
> 
> David

Good points, how about the following?

							Thanx, Paul

------------------------------------------------------------------------

pid: make setpgid() system call use RCU read-side critical section

[   23.584719]
[   23.584720] ===================================================
[   23.585059] [ INFO: suspicious rcu_dereference_check() usage. ]
[   23.585176] ---------------------------------------------------
[   23.585176] kernel/pid.c:419 invoked rcu_dereference_check() without protection!
[   23.585176]
[   23.585176] other info that might help us debug this:
[   23.585176]
[   23.585176]
[   23.585176] rcu_scheduler_active = 1, debug_locks = 1
[   23.585176] 1 lock held by rc.sysinit/728:
[   23.585176]  #0:  (tasklist_lock){.+.+..}, at: [<ffffffff8104771f>] sys_setpgid+0x5f/0x193
[   23.585176]
[   23.585176] stack backtrace:
[   23.585176] Pid: 728, comm: rc.sysinit Not tainted 2.6.36-rc2 #2
[   23.585176] Call Trace:
[   23.585176]  [<ffffffff8105b436>] lockdep_rcu_dereference+0x99/0xa2
[   23.585176]  [<ffffffff8104c324>] find_task_by_pid_ns+0x50/0x6a
[   23.585176]  [<ffffffff8104c35b>] find_task_by_vpid+0x1d/0x1f
[   23.585176]  [<ffffffff81047727>] sys_setpgid+0x67/0x193
[   23.585176]  [<ffffffff810029eb>] system_call_fastpath+0x16/0x1b
[   24.959669] type=1400 audit(1282938522.956:4): avc:  denied  { module_request } for  pid=766 comm="hwclock" kmod="char-major-10-135" scontext=system_u:system_r:hwclock_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclas

It turns out that the setpgid() system call fails to enter an RCU
read-side critical section before doing a PID-to-task_struct translation.
This commit therefore does rcu_read_lock() before the translation, and
also does rcu_read_unlock() after the last use of the returned pointer.

Reported-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

diff --git a/kernel/sys.c b/kernel/sys.c
index e9ad444..7f5a0cd 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -931,6 +931,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
 		pgid = pid;
 	if (pgid < 0)
 		return -EINVAL;
+	rcu_read_lock();
 
 	/* From this point forward we keep holding onto the tasklist lock
 	 * so that our parent does not change from under us. -DaveM
@@ -984,6 +985,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
 out:
 	/* All paths lead to here, thus we are safe. -DaveM */
 	write_unlock_irq(&tasklist_lock);
+	rcu_read_unlock();
 	return err;
 }
 

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-08-31 15:12   ` Paul E. McKenney
@ 2010-08-31 15:31     ` David Howells
  0 siblings, 0 replies; 9+ messages in thread
From: David Howells @ 2010-08-31 15:31 UTC (permalink / raw)
  To: paulmck
  Cc: dhowells, linux-kernel, mingo, laijs, dipankar, akpm,
	mathieu.desnoyers, josh, dvhltc, niv, tglx, peterz, rostedt,
	Valdis.Kletnieks, eric.dumazet, jslaby, jmorris

Paul E. McKenney <paulmck@linux.vnet.ibm.com> wrote:

> It turns out that the setpgid() system call fails to enter an RCU
> read-side critical section before doing a PID-to-task_struct translation.
> This commit therefore does rcu_read_lock() before the translation, and
> also does rcu_read_unlock() after the last use of the returned pointer.
> 
> Reported-by: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

Acked-by: David Howells <dhowells@redhat.com>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-08-30 19:51 ` Jiri Slaby
  2010-08-30 20:32   ` Paul E. McKenney
@ 2010-09-09 22:15   ` Oleg Nesterov
  2010-09-16  9:18     ` Jiri Slaby
  1 sibling, 1 reply; 9+ messages in thread
From: Oleg Nesterov @ 2010-09-09 22:15 UTC (permalink / raw)
  To: Jiri Slaby
  Cc: paulmck, linux-kernel, mingo, laijs, dipankar, akpm,
	mathieu.desnoyers, josh, dvhltc, niv, tglx, peterz, rostedt,
	Valdis.Kletnieks, dhowells, eric.dumazet, jmorris

On 08/30, Jiri Slaby wrote:
>
> Ccing Oleg.

Sorry for delay...

> > --- a/kernel/sys.c
> > +++ b/kernel/sys.c
> > @@ -938,6 +938,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
> >  	write_lock_irq(&tasklist_lock);
> >
> >  	err = -ESRCH;
> > +	rcu_read_lock();
> >  	p = find_task_by_vpid(pid);
>
> AFAICT the missing lock doesn't harm due to the write_lock of tasklist
> above. But is probably a good thing to do anyway.

The problem is, find_task_by_vpid() is not safe without RCU. It is not
that the returned task_struct can't go away, find_pid_ns() itself is
not safe. This is because the failing copy_process() calls free_pid()
without tasklist_lock and modifies pid_hash[] list.

Oleg.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-09-09 22:15   ` Oleg Nesterov
@ 2010-09-16  9:18     ` Jiri Slaby
  2010-09-16 16:39       ` Oleg Nesterov
  0 siblings, 1 reply; 9+ messages in thread
From: Jiri Slaby @ 2010-09-16  9:18 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: paulmck, linux-kernel, mingo, laijs, dipankar, akpm,
	mathieu.desnoyers, josh, dvhltc, niv, tglx, peterz, rostedt,
	Valdis.Kletnieks, dhowells, eric.dumazet, jmorris, stable

On 09/10/2010 12:15 AM, Oleg Nesterov wrote:
> On 08/30, Jiri Slaby wrote:
>>> --- a/kernel/sys.c
>>> +++ b/kernel/sys.c
>>> @@ -938,6 +938,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
>>>  	write_lock_irq(&tasklist_lock);
>>>
>>>  	err = -ESRCH;
>>> +	rcu_read_lock();
>>>  	p = find_task_by_vpid(pid);
>>
>> AFAICT the missing lock doesn't harm due to the write_lock of tasklist
>> above. But is probably a good thing to do anyway.
> 
> The problem is, find_task_by_vpid() is not safe without RCU. It is not
> that the returned task_struct can't go away, find_pid_ns() itself is
> not safe. This is because the failing copy_process() calls free_pid()
> without tasklist_lock and modifies pid_hash[] list.

That said, it (950eaaca681c4) should probably go into stable. (Apply to
all 32-35 whichever are maintained currently.)

thanks,
-- 
js
suse labs

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section
  2010-09-16  9:18     ` Jiri Slaby
@ 2010-09-16 16:39       ` Oleg Nesterov
  0 siblings, 0 replies; 9+ messages in thread
From: Oleg Nesterov @ 2010-09-16 16:39 UTC (permalink / raw)
  To: Jiri Slaby
  Cc: paulmck, linux-kernel, mingo, laijs, dipankar, akpm,
	mathieu.desnoyers, josh, dvhltc, niv, tglx, peterz, rostedt,
	Valdis.Kletnieks, dhowells, eric.dumazet, jmorris, stable

On 09/16, Jiri Slaby wrote:
>
> On 09/10/2010 12:15 AM, Oleg Nesterov wrote:
> > On 08/30, Jiri Slaby wrote:
> >>> --- a/kernel/sys.c
> >>> +++ b/kernel/sys.c
> >>> @@ -938,6 +938,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
> >>>  	write_lock_irq(&tasklist_lock);
> >>>
> >>>  	err = -ESRCH;
> >>> +	rcu_read_lock();
> >>>  	p = find_task_by_vpid(pid);
> >>
> >> AFAICT the missing lock doesn't harm due to the write_lock of tasklist
> >> above. But is probably a good thing to do anyway.
> >
> > The problem is, find_task_by_vpid() is not safe without RCU. It is not
> > that the returned task_struct can't go away, find_pid_ns() itself is
> > not safe. This is because the failing copy_process() calls free_pid()
> > without tasklist_lock and modifies pid_hash[] list.
>
> That said, it (950eaaca681c4) should probably go into stable. (Apply to
> all 32-35 whichever are maintained currently.)

Perhaps, but the race is mostly theoretical.

To be honest, I think 950eaaca681c4 needs a comment to explain what
rcu_read_lock() protects, or perhaps we can make it more explicit.

Oleg.

--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -931,7 +931,6 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
 		pgid = pid;
 	if (pgid < 0)
 		return -EINVAL;
-	rcu_read_lock();
 
 	/* From this point forward we keep holding onto the tasklist lock
 	 * so that our parent does not change from under us. -DaveM
@@ -939,7 +938,9 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
 	write_lock_irq(&tasklist_lock);
 
 	err = -ESRCH;
+	rcu_read_lock();
 	p = find_task_by_vpid(pid);
+	rcu_read_unlock();
 	if (!p)
 		goto out;
 
@@ -968,7 +969,9 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
 	if (pgid != pid) {
 		struct task_struct *g;
 
+		rcu_read_lock();
 		pgrp = find_vpid(pgid);
+		rcu_read_unlock();
 		g = pid_task(pgrp, PIDTYPE_PGID);
 		if (!g || task_session(g) != task_session(group_leader))
 			goto out;
@@ -985,7 +988,6 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
 out:
 	/* All paths lead to here, thus we are safe. -DaveM */
 	write_unlock_irq(&tasklist_lock);
-	rcu_read_unlock();
 	return err;
 }
 


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2010-09-16 17:14 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-30 17:26 [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section Paul E. McKenney
2010-08-30 19:51 ` Jiri Slaby
2010-08-30 20:32   ` Paul E. McKenney
2010-09-09 22:15   ` Oleg Nesterov
2010-09-16  9:18     ` Jiri Slaby
2010-09-16 16:39       ` Oleg Nesterov
2010-08-31 13:02 ` David Howells
2010-08-31 15:12   ` Paul E. McKenney
2010-08-31 15:31     ` David Howells

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