From d8abfab7d46a02aa1d7f2985e2df8a890ad7054f Mon Sep 17 00:00:00 2001 From: Stefan Liebler Date: Thu, 12 Apr 2018 09:37:26 +0200 Subject: S390: Fix struct sigaction for 31bit in kernel_sigaction.h. The recent commit b4a5d26d8835d972995f0a0a2f805a8845bafa0b "linux: Consolidate sigaction implementation" changed the definition of struct sigaction for s390 (31bit). Unfortunately the order of the fields were wrong. This leads to blocking testcases e.g. nptl/tst-sem11. A thread which blocks due to sem_wait() is cancelled via pthread_cancel() and the signal-handler sigcancel_handler (see /nptl/nptl-init.c is called. But it just returns as the siginfo_t argument is not setup by the kernel. Then the main-thread is blocking due to pthread_join(). The flag SA_SIGINFO is set in sa_flags in struct sigaction and is copied to the "kernel_sigaction.h" struct by the sigaction() call, but due to the wrong ordering of the struct fields, the kernel does not recognize it. --- sysdeps/unix/sysv/linux/s390/kernel_sigaction.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'sysdeps') diff --git a/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h b/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h index a8beaf7..7a6a2c4 100644 --- a/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h @@ -11,15 +11,19 @@ struct kernel_sigaction void (*_sa_sigaction)(int, siginfo_t *, void *); } _u; #define k_sa_handler _u._sa_handler -#ifndef __s390x__ - sigset_t sa_mask; - unsigned long sa_flags; - void (*sa_restorer)(void); -#else + /* The 'struct sigaction' definition in s390 kernel header + arch/s390/include/uapi/asm/signal.h is used for __NR_rt_sigaction + on 64 bits and for __NR_sigaction for 31 bits. + + The expected layout for __NR_rt_sigaction for 31 bits is either + 'struct sigaction' from include/linux/signal_types.h or + 'struct compat_sigaction' from include/linux/compat.h. + + So for __NR_rt_sigaction we can use the same layout for both s390x + and s390. */ unsigned long sa_flags; void (*sa_restorer)(void); sigset_t sa_mask; -#endif }; #define SET_SA_RESTORER(kact, act) \ -- cgit v1.1