mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
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: 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>
This commit is contained in:
parent
b3f68f16db
commit
f784e8a798
@ -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(¤t->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;
|
||||
|
Loading…
Reference in New Issue
Block a user