forked from luck/tmp_suning_uos_patched
[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>
This commit is contained in:
parent
35f5cad8c4
commit
5876700cd3
|
@ -112,6 +112,8 @@ static void __exit_signal(struct task_struct *tsk)
|
||||||
sig = NULL; /* Marker for below. */
|
sig = NULL; /* Marker for below. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__unhash_process(tsk);
|
||||||
|
|
||||||
tsk->signal = NULL;
|
tsk->signal = NULL;
|
||||||
cleanup_sighand(tsk);
|
cleanup_sighand(tsk);
|
||||||
spin_unlock(&sighand->siglock);
|
spin_unlock(&sighand->siglock);
|
||||||
|
@ -140,8 +142,6 @@ void release_task(struct task_struct * p)
|
||||||
BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children));
|
BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children));
|
||||||
__exit_signal(p);
|
__exit_signal(p);
|
||||||
|
|
||||||
__unhash_process(p);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are the last non-leader member of the thread
|
* If we are the last non-leader member of the thread
|
||||||
* group, and the leader is zombie, then notify the
|
* group, and the leader is zombie, then notify the
|
||||||
|
|
Loading…
Reference in New Issue
Block a user