Re: [PATCH RFC] pid: make setpgid() system call use RCU read-side critical section

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Oleg Nesterov
Date: Thursday, September 16, 2010 - 9:39 am

On 09/16, Jiri Slaby wrote:

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;
 }
 

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH RFC] pid: make setpgid() system call use RCU read-s ..., Paul E. McKenney, (Mon Aug 30, 10:26 am)
Re: [PATCH RFC] pid: make setpgid() system call use RCU re ..., Oleg Nesterov, (Thu Sep 16, 9:39 am)