[PATCH] do __unhash_process() under ->siglock
Oleg Nesterov [Wed, 29 Mar 2006 00:11:20 +0000 (16:11 -0800)]
This patch moves __unhash_process() call from realease_task() to
__exit_signal(), so __detach_pid() is called with ->siglock held.

This means we don't need tasklist_lock to iterate over thread group anymore:

copy_process() was already changed to do attach_pid()
under ->siglock.

Eric's "pidhash-kill-switch_exec_pids.patch" from -mm
changed de_thread() so it doesn't touch PIDTYPE_TGID.

NOTE: de_thread() still needs some attention.  It still changes task->pid
lockless.  Taking ->sighand.siglock here allows to do more tasklist_lock
removals.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

kernel/exit.c

index 6b2e4cf..44d6c6e 100644 (file)
@@ -112,6 +112,8 @@ static void __exit_signal(struct task_struct *tsk)
                sig = NULL; /* Marker for below. */
        }
 
+       __unhash_process(tsk);
+
        tsk->signal = NULL;
        cleanup_sighand(tsk);
        spin_unlock(&sighand->siglock);
@@ -140,8 +142,6 @@ repeat:
        BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children));
        __exit_signal(p);
 
-       __unhash_process(p);
-
        /*
         * If we are the last non-leader member of the thread
         * group, and the leader is zombie, then notify the