On 04/25, Al Viro wrote: > > On Wed, Apr 25, 2012 at 05:46:11PM +0200, Oleg Nesterov wrote: > > > > --- x/arch/x86/kernel/signal.c > > +++ x/arch/x86/kernel/signal.c > > @@ -711,6 +711,13 @@ handle_signal(unsigned long sig, siginfo > > regs->ax = regs->orig_ax; > > regs->ip -= 2; > > break; > > + > > + case -EINTR: > > + break; > > + > > + default: > > + if (regs->orig_ax == NR_eintr) > > + regs->ax = NR_eintr; > > } > > } > > > > @@ -791,6 +798,7 @@ static void do_signal(struct pt_regs *re > > case -ERESTARTSYS: > > case -ERESTARTNOINTR: > > regs->ax = regs->orig_ax; > > + regs->orig_ax = NR_eintr; > > regs->ip -= 2; > > break; > > > > > > this ignores ERESTART_RESTARTBLOCK for simplicity. > > Ehh... You do realize that it's that simple only on architectures that > have syscall number in a register? No, I do not ;) I simply know nothing about other architectures. > Take a look at e.g. insert_restart_trampoline() > in arch/parisc/kernel/signal.c Will do. Not sure I will be able to undestand it though. And btw I still didn't look at the signal patches in your tree, I've just returned from vacation today. > I'm not sure that SA_RESTART case is actually worth bothering with - Neither me. But, > AFAICS, your mechanism won't cover SA_RESTART/SA_RESTART/!SA_RESTART > combinations anyway, Confused. The hack above doesn't even try to cover this case (and it is obviously wrong in ERESTARTSYS/NOINTR case), I only tried to illustrate the idea. > syscall interrupted > SA_RESTART signal arrives, handler1 entered > !SA_RESTART signal arrives, handler2 entered > handler2 returns > hander1 returns > syscall restarts And there is another case: syscall interrupted, it returns ERESTARTSYS. do_signal() sees no signal, restarts the syscall !SA_RESTART comes before we return to user-mode This doesn't really differ from sigsuspend/ERESTARTNOHAND we discussed before. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html