Merge signal race fixes from i386 to x86-64. Fix a bug in system call restart, noted by John Blackwood. arch/x86_64/ia32/ia32_signal.c | 3 +++ arch/x86_64/kernel/signal.c | 12 ++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff -puN arch/x86_64/ia32/ia32_signal.c~x86_64-07 arch/x86_64/ia32/ia32_signal.c --- 25/arch/x86_64/ia32/ia32_signal.c~x86_64-07 2003-12-23 23:56:33.000000000 -0800 +++ 25-akpm/arch/x86_64/ia32/ia32_signal.c 2003-12-23 23:56:33.000000000 -0800 @@ -173,6 +173,9 @@ ia32_restore_sigcontext(struct pt_regs * { unsigned int err = 0; + /* Always make any pending restarted system calls return -EINTR */ + current_thread_info()->restart_block.fn = do_no_restart_syscall; + #if DEBUG_SIG printk("SIG restore_sigcontext: sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n", sc, sc->err, sc->eip, sc->cs, sc->eflags); diff -puN arch/x86_64/kernel/signal.c~x86_64-07 arch/x86_64/kernel/signal.c --- 25/arch/x86_64/kernel/signal.c~x86_64-07 2003-12-23 23:56:33.000000000 -0800 +++ 25-akpm/arch/x86_64/kernel/signal.c 2003-12-23 23:56:33.000000000 -0800 @@ -93,6 +93,8 @@ restore_sigcontext(struct pt_regs *regs, { unsigned int err = 0; + /* Always make any pending restarted system calls return -EINTR */ + current_thread_info()->restart_block.fn = do_no_restart_syscall; #define COPY(x) err |= __get_user(regs->x, &sc->x) @@ -355,8 +357,6 @@ handle_signal(unsigned long sig, siginfo /* If so, check system call restarting.. */ switch (regs->rax) { case -ERESTART_RESTARTBLOCK: - current_thread_info()->restart_block.fn = do_no_restart_syscall; - /* FALL THROUGH */ case -ERESTARTNOHAND: regs->rax = -EINTR; break; @@ -371,10 +371,6 @@ handle_signal(unsigned long sig, siginfo regs->rax = regs->orig_rax; regs->rip -= 2; } - if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK){ - regs->rax = __NR_restart_syscall; - regs->rip -= 2; - } } #ifdef CONFIG_IA32_EMULATION @@ -453,6 +449,10 @@ int do_signal(struct pt_regs *regs, sigs regs->rax = regs->orig_rax; regs->rip -= 2; } + if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK) { + regs->rax = __NR_restart_syscall; + regs->rip -= 2; + } } return 0; } _