Re: while_each_thread() under rcu_read_lock() is broken?

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Oleg Nesterov
Date: Tuesday, June 29, 2010 - 6:05 am

On 06/28, Paul E. McKenney wrote:

Confused.

Let's return to

	do
		printk("%d\n", t->pid);
	while_each_thread(g, t);

for the moment.

In that case, if g != 2910 (the exiting thread) we will print all pids,
except we can miss 2910. With or without next_thread_careful().

Only if we start at g == 2910, then

	current code:		print 2910, then spin forever printing
				other pids

	next_thread_careful:	stop printing when we notice that 2910
				was unhashed.

				So, yes, in this case we can miss all
				other threads.

As for "ls"ing the relevant /proc entry. proc_task_readdir() is complicated,
it can drop rcu lock, sleep, etc. But basically it mimics while_each_thread()
logic. Let's assume that proc_task_fill_cache() never fails.

proc_task_readdir() always starts at the group_leader, 2908. So, with or
without next_thread_careful() we can only miss the exiting 2910.

But (again, unless I missed something) the current code can race with exec,
and s/next_thread/next_thread_careful/ in first_tid() can fix the race.
(just in case, we can fix it differently).

But, of course, if you do "ls /proc/2910/task" instead of "ls /proc/2908/task"
you can miss _all_ threads if 2910 exits before proc_task_readdir() finds
its leader, 2908. Again, this is with or without next_thread_careful().


Paul, please let me know if I misunderstood your concerns, or if I missed
something.

Oleg.

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

Messages in current thread:
while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Fri Jun 18, 12:34 pm)
Re: [PATCH] fix the racy check_hung_uninterruptible_tasks( ..., Frederic Weisbecker, (Fri Jun 18, 1:11 pm)
Re: [PATCH] fix the racy check_hung_uninterruptible_tasks( ..., Mandeep Singh Baines, (Fri Jun 18, 1:38 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Roland McGrath, (Fri Jun 18, 2:08 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Fri Jun 18, 3:33 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Fri Jun 18, 3:37 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Mandeep Baines, (Fri Jun 18, 10:00 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Frederic Weisbecker, (Fri Jun 18, 10:35 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Mandeep Baines, (Sat Jun 19, 8:44 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Sat Jun 19, 12:19 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Mon Jun 21, 10:09 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Mon Jun 21, 10:44 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Mon Jun 21, 11:00 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Roland McGrath, (Mon Jun 21, 12:02 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Mon Jun 21, 1:06 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Mon Jun 21, 1:51 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Eric W. Biederman, (Mon Jun 21, 2:19 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Eric W. Biederman, (Mon Jun 21, 2:22 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Mon Jun 21, 2:38 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Tue Jun 22, 7:34 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Tue Jun 22, 2:23 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Tue Jun 22, 3:12 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Wed Jun 23, 8:24 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Thu Jun 24, 11:07 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Chris Friesen, (Thu Jun 24, 11:50 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Roland McGrath, (Thu Jun 24, 2:14 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Thu Jun 24, 2:57 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Thu Jun 24, 3:00 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Eric W. Biederman, (Thu Jun 24, 5:08 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Thu Jun 24, 8:37 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Thu Jun 24, 8:41 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Thu Jun 24, 8:42 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Fri Jun 25, 2:55 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Fri Jun 25, 3:08 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Mon Jun 28, 4:43 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Tue Jun 29, 6:05 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Tue Jun 29, 8:34 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Oleg Nesterov, (Tue Jun 29, 10:54 am)
Re: while_each_thread() under rcu_read_lock() is broken?, Roland McGrath, (Thu Jul 8, 4:59 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Roland McGrath, (Thu Jul 8, 5:41 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Thu Jul 8, 5:41 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Roland McGrath, (Thu Jul 8, 5:52 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Roland McGrath, (Thu Jul 8, 6:01 pm)
Re: while_each_thread() under rcu_read_lock() is broken?, Paul E. McKenney, (Fri Jul 9, 9:18 am)