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

From: Eric W. Biederman
Date: Thu Jun 24 2010 - 20:08:40 EST


Oleg Nesterov <oleg@xxxxxxxxxx> writes:

> On 06/24, Chris Friesen wrote:
>>
>> On 06/24/2010 12:07 PM, Paul E. McKenney wrote:
>>
>> > 3. The thread-group leader might do pthread_exit(), removing itself
>> > from the thread group -- and might do so while the hapless reader
>> > is referencing that thread.
>> >
>> > But isn't this prohibited? Or is it really legal to do a
>> > pthread_create() to create a new thread and then have the
>> > parent thread call pthread_exit()? Not something I would
>> > consider trying in my own code! Well, I might, just to
>> > be perverse, but... ;-)
>>
>> I believe SUS allows the main thread to explicitly call pthread_exit(),
>> leaving the other threads to run. If the main() routine just returns
>> then it implicitly calls exit().
>
> Correct.
>
> But, to clarify, if the main thread does pthread_exit() (sys_exit,
> actually), it won't be removed from the group. It will be zombie
> until all other threads exit.

That we don't cleanup that zombie leaders is unfortunate really, it
means we have the entire de_thread special case. But short fixing
libpthread to not make bad assumptions there is little we can do about
it really.

I'm only half following this conversation.

If what we are looking for is a stable list_head that won't disappear
on us we should be able to put one in sighand_struct or signal_struct
(I forget which is which at the moment) and have a list_head that
lives for the life of the longest living thread, and that won't get
messed up by things like de_thread, and then next_thread could simply
return NULL when we hit the end of the list.

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