diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2006-03-28 19:11:20 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-28 21:36:43 -0500 |
commit | 5876700cd399112ecfa70df36203c8c6660d84f8 (patch) | |
tree | 3060724c6682ee7452bcb7b3c99eded75cd59ea7 /kernel/exit.c | |
parent | 35f5cad8c4bab94ecc5acdc4055df5ea12dc76f8 (diff) |
[PATCH] do __unhash_process() under ->siglock
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>
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 6b2e4cf3e140..44d6c6e3896d 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -112,6 +112,8 @@ static void __exit_signal(struct task_struct *tsk) | |||
112 | sig = NULL; /* Marker for below. */ | 112 | sig = NULL; /* Marker for below. */ |
113 | } | 113 | } |
114 | 114 | ||
115 | __unhash_process(tsk); | ||
116 | |||
115 | tsk->signal = NULL; | 117 | tsk->signal = NULL; |
116 | cleanup_sighand(tsk); | 118 | cleanup_sighand(tsk); |
117 | spin_unlock(&sighand->siglock); | 119 | spin_unlock(&sighand->siglock); |
@@ -140,8 +142,6 @@ repeat: | |||
140 | BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children)); | 142 | BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children)); |
141 | __exit_signal(p); | 143 | __exit_signal(p); |
142 | 144 | ||
143 | __unhash_process(p); | ||
144 | |||
145 | /* | 145 | /* |
146 | * If we are the last non-leader member of the thread | 146 | * If we are the last non-leader member of the thread |
147 | * group, and the leader is zombie, then notify the | 147 | * group, and the leader is zombie, then notify the |