]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
task_work: Simplify the usage in ptrace_notify() and get_signal_to_deliver()
authorOleg Nesterov <oleg@redhat.com>
Sun, 26 Aug 2012 19:12:17 +0000 (21:12 +0200)
committerIngo Molnar <mingo@kernel.org>
Thu, 13 Sep 2012 14:47:37 +0000 (16:47 +0200)
ptrace_notify() and get_signal_to_deliver() do unnecessary things
before task_work_run():

1. smp_mb__after_clear_bit() is not needed, test_and_clear_bit()
   implies mb().

2. And we do not need the barrier at all, in this case we only
   care about the "synchronous" works added by the task itself.

3. No need to clear TIF_NOTIFY_RESUME, and we should not assume
   task_works is the only user of this flag.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20120826191217.GA4238@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/signal.c

index be4f856d52f81bab8184544b5dd6dd9b823bc21b..2c681f11b7d24b9deab0e7b4a7c1498f11a23b16 100644 (file)
@@ -1971,13 +1971,8 @@ static void ptrace_do_notify(int signr, int exit_code, int why)
 void ptrace_notify(int exit_code)
 {
        BUG_ON((exit_code & (0x7f | ~0xffff)) != SIGTRAP);
-       if (unlikely(current->task_works)) {
-               if (test_and_clear_ti_thread_flag(current_thread_info(),
-                                                  TIF_NOTIFY_RESUME)) {
-                       smp_mb__after_clear_bit();
-                       task_work_run();
-               }
-       }
+       if (unlikely(current->task_works))
+               task_work_run();
 
        spin_lock_irq(&current->sighand->siglock);
        ptrace_do_notify(SIGTRAP, exit_code, CLD_TRAPPED);
@@ -2198,13 +2193,8 @@ int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
        struct signal_struct *signal = current->signal;
        int signr;
 
-       if (unlikely(current->task_works)) {
-               if (test_and_clear_ti_thread_flag(current_thread_info(),
-                                                  TIF_NOTIFY_RESUME)) {
-                       smp_mb__after_clear_bit();
-                       task_work_run();
-               }
-       }
+       if (unlikely(current->task_works))
+               task_work_run();
 
        if (unlikely(uprobe_deny_signal()))
                return 0;