• Sven Schnelle's avatar
    s390: fix system call restart with multiple signals · fc66127d
    Sven Schnelle authored
    glibc complained with "The futex facility returned an unexpected error
    code.". It turned out that the futex syscall returned -ERESTARTSYS because
    a signal is pending. arch_do_signal_or_restart() restored the syscall
    parameters (nameley regs->gprs[2]) and set PIF_SYSCALL_RESTART. When
    another signal is made pending later in the exit loop
    arch_do_signal_or_restart() is called again. This function clears
    PIF_SYSCALL_RESTART and checks the return code which is set in
    regs->gprs[2]. However, regs->gprs[2] was restored in the previous run
    and no longer contains -ERESTARTSYS, so PIF_SYSCALL_RESTART isn't set
    again and the syscall is skipped.
    
    Fix this by not clearing PIF_SYSCALL_RESTART - it is already cleared in
    __do_syscall() when the syscall is restarted.
    Reported-by: default avatarBjoern Walk <bwalk@linux.ibm.com>
    Signed-off-by: default avatarSven Schnelle <svens@linux.ibm.com>
    Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Fixes: 56e62a73 ("s390: convert to generic entry")
    Cc: <stable@vger.kernel.org> # 5.12
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    fc66127d
signal.c 15.8 KB