Commit f784e8a7 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Ingo Molnar

task_work: Simplify the usage in ptrace_notify() and get_signal_to_deliver()

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: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarPeter 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.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent b3f68f16
...@@ -1971,13 +1971,8 @@ static void ptrace_do_notify(int signr, int exit_code, int why) ...@@ -1971,13 +1971,8 @@ static void ptrace_do_notify(int signr, int exit_code, int why)
void ptrace_notify(int exit_code) void ptrace_notify(int exit_code)
{ {
BUG_ON((exit_code & (0x7f | ~0xffff)) != SIGTRAP); BUG_ON((exit_code & (0x7f | ~0xffff)) != SIGTRAP);
if (unlikely(current->task_works)) { if (unlikely(current->task_works))
if (test_and_clear_ti_thread_flag(current_thread_info(), task_work_run();
TIF_NOTIFY_RESUME)) {
smp_mb__after_clear_bit();
task_work_run();
}
}
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
ptrace_do_notify(SIGTRAP, exit_code, CLD_TRAPPED); 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, ...@@ -2198,13 +2193,8 @@ int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
struct signal_struct *signal = current->signal; struct signal_struct *signal = current->signal;
int signr; int signr;
if (unlikely(current->task_works)) { if (unlikely(current->task_works))
if (test_and_clear_ti_thread_flag(current_thread_info(), task_work_run();
TIF_NOTIFY_RESUME)) {
smp_mb__after_clear_bit();
task_work_run();
}
}
if (unlikely(uprobe_deny_signal())) if (unlikely(uprobe_deny_signal()))
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment