diff options
author | Roland McGrath <roland@redhat.com> | 2008-04-30 03:53:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:29:37 -0400 |
commit | 5a8da0ea82db6fa9737041381079fd16f25dcce2 (patch) | |
tree | abd26177c0a965315de290e1e9602d087b78f149 /arch/x86/kernel/signal_64.c | |
parent | f3de272b821accbc8387211977c2de4f38468d05 (diff) |
signals: x86 TS_RESTORE_SIGMASK
Replace TIF_RESTORE_SIGMASK with TS_RESTORE_SIGMASK and define our own
set_restore_sigmask() function. This saves the costly SMP-safe set_bit
operation, which we do not need for the sigmask flag since TIF_SIGPENDING
always has to be set too.
Signed-off-by: Roland McGrath <roland@redhat.com>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/x86/kernel/signal_64.c')
-rw-r--r-- | arch/x86/kernel/signal_64.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index ccb2a4560c2d..e53b267662e7 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
@@ -427,7 +427,7 @@ static void do_signal(struct pt_regs *regs) | |||
427 | if (!user_mode(regs)) | 427 | if (!user_mode(regs)) |
428 | return; | 428 | return; |
429 | 429 | ||
430 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 430 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) |
431 | oldset = ¤t->saved_sigmask; | 431 | oldset = ¤t->saved_sigmask; |
432 | else | 432 | else |
433 | oldset = ¤t->blocked; | 433 | oldset = ¤t->blocked; |
@@ -444,11 +444,13 @@ static void do_signal(struct pt_regs *regs) | |||
444 | 444 | ||
445 | /* Whee! Actually deliver the signal. */ | 445 | /* Whee! Actually deliver the signal. */ |
446 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | 446 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { |
447 | /* a signal was successfully delivered; the saved | 447 | /* |
448 | * A signal was successfully delivered; the saved | ||
448 | * sigmask will have been stored in the signal frame, | 449 | * sigmask will have been stored in the signal frame, |
449 | * and will be restored by sigreturn, so we can simply | 450 | * and will be restored by sigreturn, so we can simply |
450 | * clear the TIF_RESTORE_SIGMASK flag */ | 451 | * clear the TS_RESTORE_SIGMASK flag. |
451 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 452 | */ |
453 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | ||
452 | } | 454 | } |
453 | return; | 455 | return; |
454 | } | 456 | } |
@@ -476,8 +478,8 @@ static void do_signal(struct pt_regs *regs) | |||
476 | * If there's no signal to deliver, we just put the saved sigmask | 478 | * If there's no signal to deliver, we just put the saved sigmask |
477 | * back. | 479 | * back. |
478 | */ | 480 | */ |
479 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 481 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
480 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 482 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
481 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 483 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
482 | } | 484 | } |
483 | } | 485 | } |
@@ -498,7 +500,7 @@ void do_notify_resume(struct pt_regs *regs, void *unused, | |||
498 | #endif /* CONFIG_X86_MCE */ | 500 | #endif /* CONFIG_X86_MCE */ |
499 | 501 | ||
500 | /* deal with pending signal delivery */ | 502 | /* deal with pending signal delivery */ |
501 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 503 | if (thread_info_flags & _TIF_SIGPENDING) |
502 | do_signal(regs); | 504 | do_signal(regs); |
503 | 505 | ||
504 | if (thread_info_flags & _TIF_HRTICK_RESCHED) | 506 | if (thread_info_flags & _TIF_HRTICK_RESCHED) |