From: Oleg Nesterov Now that ptrace_stop() can't sleep if the tracee was SIGKILL'ed, we don't need the special mm->core_waiters check in may_ptrace_stop(). It was needed to prevent the deadlock with the tracer with the same ->mm which waits for us in coredump_wait()->wait_for_completion(&startup_done), and the the unkillable tracee waits for PTRACE_CONT from the tracer. Without this check may_ptrace_stop() becomes trivial and can be removed. Signed-off-by: Oleg Nesterov Cc: Ingo Molnar Cc: Matthew Wilcox Cc: Roland McGrath Signed-off-by: Andrew Morton --- kernel/signal.c | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff -puN kernel/signal.c~ptrace-kill-may_ptrace_stop kernel/signal.c --- a/kernel/signal.c~ptrace-kill-may_ptrace_stop +++ a/kernel/signal.c @@ -1470,26 +1470,6 @@ static void do_notify_parent_cldstop(str spin_unlock_irqrestore(&sighand->siglock, flags); } -static inline int may_ptrace_stop(void) -{ - if (!likely(current->ptrace & PT_PTRACED)) - return 0; - /* - * Are we in the middle of do_coredump? - * If so and our tracer is also part of the coredump stopping - * is a deadlock situation, and pointless because our tracer - * is dead so don't allow us to stop. - * If SIGKILL was already sent before the caller unlocked - * ->siglock we must see ->core_waiters != 0. Otherwise it - * is safe to enter schedule(). - */ - if (unlikely(current->mm->core_waiters) && - unlikely(current->mm == current->parent->mm)) - return 0; - - return 1; -} - /* * This must be called with current->sighand->siglock held. * @@ -1534,7 +1514,7 @@ static void ptrace_stop(int exit_code, i __set_current_state(TASK_TRACED); spin_unlock_irq(¤t->sighand->siglock); read_lock(&tasklist_lock); - if (may_ptrace_stop()) { + if (likely(current->ptrace & PT_PTRACED)) { do_notify_parent_cldstop(current, CLD_TRAPPED); read_unlock(&tasklist_lock); schedule(); _