Eric W. Biederman de12a7878c [PATCH] de_thread: Don't confuse users do_each_thread.
Oleg Nesterov spotted two interesting bugs with the current de_thread
code.  The simplest is a long standing double decrement of
__get_cpu_var(process_counts) in __unhash_process.  Caused by
two processes exiting when only one was created.

The other is that since we no longer detach from the thread_group list
it is possible for do_each_thread when run under the tasklist_lock to
see the same task_struct twice.  Once on the task list as a
thread_group_leader, and once on the thread list of another
thread.

The double appearance in do_each_thread can cause a double increment
of mm_core_waiters in zap_threads resulting in problems later on in
coredump_wait.

To remedy those two problems this patch takes the simple approach
of changing the old thread group leader into a child thread.
The only routine in release_task that cares is __unhash_process,
and it can be trivially seen that we handle cleaning up a
thread group leader properly.

Since de_thread doesn't change the pid of the exiting leader process
and instead shares it with the new leader process.  I change
thread_group_leader to recognize group leadership based on the
group_leader field and not based on pids.  This should also be
slightly cheaper then the existing thread_group_leader macro.

I performed a quick audit and I couldn't see any user of
thread_group_leader that cared about the difference.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-04-10 16:36:50 -07:00
..
2006-03-31 12:18:51 -08:00
2006-04-01 01:15:35 +02:00
2006-03-26 08:56:55 -08:00
2006-03-31 12:18:55 -08:00
2006-03-24 07:33:19 -08:00
2006-03-29 13:24:50 +11:00
2006-04-01 01:16:26 +02:00
2006-04-02 13:39:21 +02:00
2006-04-02 13:40:13 +02:00
2006-03-31 12:18:55 -08:00
2006-01-11 18:42:13 -08:00
2006-01-10 08:01:25 -08:00
2006-04-02 13:36:13 +02:00
2006-01-08 20:12:40 -08:00
2006-04-02 13:37:19 +02:00
2005-10-30 17:37:32 -08:00
2006-04-02 13:38:18 +02:00
2006-01-11 18:42:13 -08:00
2006-01-11 18:42:13 -08:00
2006-03-23 23:44:19 -05:00
2006-03-31 12:18:54 -08:00
2006-03-28 09:16:08 -08:00
2006-03-24 07:33:19 -08:00
2006-03-24 07:33:24 -08:00
2005-11-07 18:18:11 -08:00
2006-03-23 07:38:11 -08:00
2006-03-23 07:38:11 -08:00
2006-03-23 07:38:12 -08:00
2006-02-11 21:41:10 -08:00
2006-03-26 08:56:55 -08:00
2006-03-31 12:18:54 -08:00