diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-19 01:13:01 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-01 09:58:14 -0400 |
commit | e3b880c6ee55e8858a75e3dcf6c3dda04d5e3605 (patch) | |
tree | 6d8ab01a85cd9c36b7480f0725447863f4412903 /arch | |
parent | 00df111e7eb505558c54f23861e9341e56dd5fb0 (diff) |
parisc: don't bother looping in do_signal()
entry.S code had been looping until no pending signals are left
since 2005 anyway; no need to bother with that in do_signal()
itself. If the failure to set a sigframe up raises SIGSEGV,
we'll just pick it up the next time around the loop(s) in entry.S
anyway.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/parisc/kernel/signal.c | 29 |
1 files changed, 7 insertions, 22 deletions
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 3790a3237172..537996955998 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
@@ -439,7 +439,7 @@ give_sigsegv: | |||
439 | * OK, we're invoking a handler. | 439 | * OK, we're invoking a handler. |
440 | */ | 440 | */ |
441 | 441 | ||
442 | static long | 442 | static void |
443 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 443 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, |
444 | struct pt_regs *regs, int in_syscall) | 444 | struct pt_regs *regs, int in_syscall) |
445 | { | 445 | { |
@@ -449,7 +449,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
449 | 449 | ||
450 | /* Set up the stack frame */ | 450 | /* Set up the stack frame */ |
451 | if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall)) | 451 | if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall)) |
452 | return 0; | 452 | return; |
453 | 453 | ||
454 | signal_delivered(sig, info, ka, regs, | 454 | signal_delivered(sig, info, ka, regs, |
455 | test_thread_flag(TIF_SINGLESTEP) || | 455 | test_thread_flag(TIF_SINGLESTEP) || |
@@ -457,8 +457,6 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
457 | 457 | ||
458 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", | 458 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", |
459 | regs->gr[28]); | 459 | regs->gr[28]); |
460 | |||
461 | return 1; | ||
462 | } | 460 | } |
463 | 461 | ||
464 | static inline void | 462 | static inline void |
@@ -570,30 +568,17 @@ do_signal(struct pt_regs *regs, long in_syscall) | |||
570 | DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n", | 568 | DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n", |
571 | regs, regs->sr[7], in_syscall); | 569 | regs, regs->sr[7], in_syscall); |
572 | 570 | ||
573 | /* Everyone else checks to see if they are in kernel mode at | 571 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
574 | this point and exits if that's the case. I'm not sure why | 572 | DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]); |
575 | we would be called in that case, but for some reason we | ||
576 | are. */ | ||
577 | |||
578 | /* May need to force signal if handle_signal failed to deliver */ | ||
579 | while (1) { | ||
580 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | ||
581 | DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]); | ||
582 | 573 | ||
583 | if (signr <= 0) | 574 | if (signr > 0) { |
584 | break; | ||
585 | |||
586 | /* Restart a system call if necessary. */ | 575 | /* Restart a system call if necessary. */ |
587 | if (in_syscall) | 576 | if (in_syscall) |
588 | syscall_restart(regs, &ka); | 577 | syscall_restart(regs, &ka); |
589 | 578 | ||
590 | /* Whee! Actually deliver the signal. If the | 579 | handle_signal(signr, &info, &ka, regs, in_syscall); |
591 | delivery failed, we need to continue to iterate in | 580 | return; |
592 | this loop so we can deliver the SIGSEGV... */ | ||
593 | if (handle_signal(signr, &info, &ka, regs, in_syscall)) | ||
594 | return; | ||
595 | } | 581 | } |
596 | /* end of while(1) looping forever if we can't force a signal */ | ||
597 | 582 | ||
598 | /* Did we come from a system call? */ | 583 | /* Did we come from a system call? */ |
599 | if (in_syscall) | 584 | if (in_syscall) |