* Jason A. Donenfeld: > Not in current kernels, where it always returns at least PAGE_SIZE bytes > before checking for pending signals. In older kernels, if there was a > signal pending at the top, it would do no work and return -ERESTARTSYS, > which I believe should then get restarted by glibc's syscaller? glibc does not handle ERESTARTSYS, it's a kernel-internal error code that's not exported in UAPI headers and must not leak to userspace (except perhaps via ptrace). I believe restarts are handled in the kernel signal code, by tweaking the program counter. Looking at that, ERESTARTSYS gets translated to EINTR for !SA_RESTART system calls: /* Are we from a system call? */ if (syscall_get_nr(current, regs) != -1) { /* If so, check system call restarting.. */ switch (syscall_get_error(current, regs)) { case -ERESTART_RESTARTBLOCK: case -ERESTARTNOHAND: regs->ax = -EINTR; break; case -ERESTARTSYS: if (!(ksig->ka.sa.sa_flags & SA_RESTART)) { regs->ax = -EINTR; break; } fallthrough; case -ERESTARTNOINTR: regs->ax = regs->orig_ax; regs->ip -= 2; break; } } (arch/x86/kernel/signal.c) Thanks, Florian