aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-09-17 14:56:16 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-09-17 14:56:16 +0100
commitb2b163bb82b12bae2504a5b31399c37d099ad3cc (patch)
treec82f6af3b566b449895e202962d2dc7caed1f20f
parent1a8e41cd672f894bbd74874eac601e6cedf838fb (diff)
downloadkernel_samsung_crespo-b2b163bb82b12bae2504a5b31399c37d099ad3cc.zip
kernel_samsung_crespo-b2b163bb82b12bae2504a5b31399c37d099ad3cc.tar.gz
kernel_samsung_crespo-b2b163bb82b12bae2504a5b31399c37d099ad3cc.tar.bz2
ARM: prevent multiple syscall restarts
Al Viro reports that calling "sys_sigsuspend(-ERESTARTNOHAND, 0, 0)" with two signals coming and being handled in kernel space results in the syscall restart being done twice. Avoid this by clearing the 'why' flag when we call the signal handling code to prevent further syscall restarts after the first. Acked-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/kernel/entry-common.S2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index f05a35a..4a560d3 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -48,6 +48,8 @@ work_pending:
beq no_work_pending
mov r0, sp @ 'regs'
mov r2, why @ 'syscall'
+ tst r1, #_TIF_SIGPENDING @ delivering a signal?
+ movne why, #0 @ prevent further restarts
bl do_notify_resume
b ret_slow_syscall @ Check work again