signals: de_thread: simplify the ->child_reaper switching
Subsystems (2)
PATCH 2/3 signals: de_thread: simplify the ->child_reaper switching
Now that we rely on SIGNAL_UNKILLABLE flag, de_thread() doesn't need the nasty hack to kill the old ->child_reaper during the mt-exec.
This also means we can avoid taking tasklist_lock around zap_other_threads().
Signed-off-by Oleg Nesterov <[email protected]>
fs/exec.c renamed from fs/exec.c~2_EXEC_KILL_HACK +2 -13
@@ -757,9 +757,7 @@ static int de_thread(struct task_struct/* * Kill all other threads in the thread group. -* We must hold tasklist_lock to call zap_other_threads. */ -read_lock (&tasklist_lock);spin_lock_irq (lock);if (signal_group_exit (sig)) {/*
@@ -767,21 +765,10 @@ static int de_thread(struct task_struct* return so that the signal is processed. */ spin_unlock_irq (lock); -read_unlock (&tasklist_lock);return -EAGAIN ; } - -/* -* child_reaper ignores SIGKILL, change it now. -* Reparenting needs write_lock on tasklist_lock, -* so it is safe to do it under read_lock. -*/ -if (unlikely (tsk->group_leader ==task_child_reaper (tsk))) -task_active_pid_ns (tsk)->child_reaper = tsk; - sig->group_exit_task = tsk;zap_other_threads (tsk); -read_unlock (&tasklist_lock);/* Account for the thread group leader hanging around: */ count =thread_group_leader (tsk) ?1 :2 ;
@@ -812,6 +799,8 @@ static int de_thread(struct task_structschedule (); } +if (unlikely (task_child_reaper (tsk) == leader)) +task_active_pid_ns (tsk)->child_reaper = tsk;/* * The only record we have of the real-time age of a * process, regardless of execs it's done, is start_time.