diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-20 15:16:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-20 15:16:28 -0400 |
commit | fd11e153b82ad1c84ccc71ba1cfedc222465198c (patch) | |
tree | eb62a490ca322d0a41a41ad94820677ef7737b1b /arch/sparc/kernel/signal_64.c | |
parent | 505f48b53478d3816d1f3b001815703cfd7afa09 (diff) | |
parent | aad4564498dcb0aad769a79e5e2aa9a661dfb51f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
sparc: Add alignment flag to PCI expansion resources
sparc: Avoid calling sigprocmask()
sparc: Use set_current_blocked()
sparc32,leon: SRMMU MMU Table probe fix
Diffstat (limited to 'arch/sparc/kernel/signal_64.c')
-rw-r--r-- | arch/sparc/kernel/signal_64.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 47509df3b893..a2b81598d905 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
@@ -70,10 +70,7 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs) | |||
70 | goto do_sigsegv; | 70 | goto do_sigsegv; |
71 | } | 71 | } |
72 | sigdelsetmask(&set, ~_BLOCKABLE); | 72 | sigdelsetmask(&set, ~_BLOCKABLE); |
73 | spin_lock_irq(¤t->sighand->siglock); | 73 | set_current_blocked(&set); |
74 | current->blocked = set; | ||
75 | recalc_sigpending(); | ||
76 | spin_unlock_irq(¤t->sighand->siglock); | ||
77 | } | 74 | } |
78 | if (test_thread_flag(TIF_32BIT)) { | 75 | if (test_thread_flag(TIF_32BIT)) { |
79 | pc &= 0xffffffff; | 76 | pc &= 0xffffffff; |
@@ -242,12 +239,13 @@ struct rt_signal_frame { | |||
242 | 239 | ||
243 | static long _sigpause_common(old_sigset_t set) | 240 | static long _sigpause_common(old_sigset_t set) |
244 | { | 241 | { |
245 | set &= _BLOCKABLE; | 242 | sigset_t blocked; |
246 | spin_lock_irq(¤t->sighand->siglock); | 243 | |
247 | current->saved_sigmask = current->blocked; | 244 | current->saved_sigmask = current->blocked; |
248 | siginitset(¤t->blocked, set); | 245 | |
249 | recalc_sigpending(); | 246 | set &= _BLOCKABLE; |
250 | spin_unlock_irq(¤t->sighand->siglock); | 247 | siginitset(&blocked, set); |
248 | set_current_blocked(&blocked); | ||
251 | 249 | ||
252 | current->state = TASK_INTERRUPTIBLE; | 250 | current->state = TASK_INTERRUPTIBLE; |
253 | schedule(); | 251 | schedule(); |
@@ -327,10 +325,7 @@ void do_rt_sigreturn(struct pt_regs *regs) | |||
327 | pt_regs_clear_syscall(regs); | 325 | pt_regs_clear_syscall(regs); |
328 | 326 | ||
329 | sigdelsetmask(&set, ~_BLOCKABLE); | 327 | sigdelsetmask(&set, ~_BLOCKABLE); |
330 | spin_lock_irq(¤t->sighand->siglock); | 328 | set_current_blocked(&set); |
331 | current->blocked = set; | ||
332 | recalc_sigpending(); | ||
333 | spin_unlock_irq(¤t->sighand->siglock); | ||
334 | return; | 329 | return; |
335 | segv: | 330 | segv: |
336 | force_sig(SIGSEGV, current); | 331 | force_sig(SIGSEGV, current); |
@@ -484,18 +479,17 @@ static inline int handle_signal(unsigned long signr, struct k_sigaction *ka, | |||
484 | siginfo_t *info, | 479 | siginfo_t *info, |
485 | sigset_t *oldset, struct pt_regs *regs) | 480 | sigset_t *oldset, struct pt_regs *regs) |
486 | { | 481 | { |
482 | sigset_t blocked; | ||
487 | int err; | 483 | int err; |
488 | 484 | ||
489 | err = setup_rt_frame(ka, regs, signr, oldset, | 485 | err = setup_rt_frame(ka, regs, signr, oldset, |
490 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); | 486 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); |
491 | if (err) | 487 | if (err) |
492 | return err; | 488 | return err; |
493 | spin_lock_irq(¤t->sighand->siglock); | 489 | sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask); |
494 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
495 | if (!(ka->sa.sa_flags & SA_NOMASK)) | 490 | if (!(ka->sa.sa_flags & SA_NOMASK)) |
496 | sigaddset(¤t->blocked,signr); | 491 | sigaddset(&blocked, signr); |
497 | recalc_sigpending(); | 492 | set_current_blocked(&blocked); |
498 | spin_unlock_irq(¤t->sighand->siglock); | ||
499 | 493 | ||
500 | tracehook_signal_handler(signr, info, ka, regs, 0); | 494 | tracehook_signal_handler(signr, info, ka, regs, 0); |
501 | 495 | ||
@@ -601,7 +595,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
601 | */ | 595 | */ |
602 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { | 596 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
603 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 597 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
604 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 598 | set_current_blocked(¤t->saved_sigmask); |
605 | } | 599 | } |
606 | } | 600 | } |
607 | 601 | ||