Messages in this thread Patch in this message |  | | Date | Mon, 16 Jun 2008 18:20:19 +0400 | From | Oleg Nesterov <> | Subject | [PATCH 3/3] ptrace: kill may_ptrace_stop() |
| |
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 <oleg@tv-sign.ru>
--- 26-rc2/kernel/signal.c~ 2008-06-15 16:15:46.000000000 +0400 +++ 26-rc2/kernel/signal.c 2008-06-15 17:51:50.000000000 +0400 @@ -1472,26 +1472,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. * @@ -1536,7 +1516,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();
|  |