finish_utrace_stop() can check for pending SIGKILL lockless,
ant it can use __fatal_signal_pending() helper.

Signed-off-by: Oleg Nesterov <o...@redhat.com>
---

 kernel/utrace.c |    8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

--- __UTRACE/kernel/utrace.c~1_FINISH_FATAL_SIGNAL      2009-08-14 
11:58:05.000000000 +0200
+++ __UTRACE/kernel/utrace.c    2009-08-14 12:43:44.000000000 +0200
@@ -354,17 +354,15 @@ static inline bool finish_utrace_stop(st
         * We're officially awake if it's clear.
         */
        if (unlikely(utrace->stopped)) {
-               spin_lock(&utrace->lock);
                /*
                 * If we're here with it still set, it must have been
                 * signal_wake_up() instead, waking us up for a SIGKILL.
                 */
-               spin_lock_irq(&task->sighand->siglock);
-               WARN_ON(!sigismember(&task->pending.signal, SIGKILL));
-               spin_unlock_irq(&task->sighand->siglock);
+               WARN_ON(!__fatal_signal_pending(task));
+               spin_lock(&utrace->lock);
                utrace->stopped = 0;
-               killed = true;
                spin_unlock(&utrace->lock);
+               killed = true;
        }
 
        return killed;

Reply via email to