Message ID | 20191011191554.10870-3-adhemerval.zanella@linaro.org |
---|---|
State | Accepted |
Commit | 720e9541f5d919f3735925a4e6324ecdec171844 |
Headers | show |
Series | [1/3] ipc: Refactor sysvipc internal definitions | expand |
On 10/11/19 2:15 PM, Adhemerval Zanella wrote: > Linux 5.1 adds missing SySV IPC syscalls to the syscall table for > remanining one that still uses the ipc syscall on glibc (m68k, mips-o32, > powerpc, s390, sh, and sparc32). However the newly added direct ipc > syscall are different than the old ones: > > 1. They do not expect IPC_64, meaning __IPC_64 should be set to zero > when new syscalls are used. And new syscalls can not be used > for compat functions like __old_semctl (to emulated old sysvipc it > requires to use the old __NR_ipc syscall without __IPC_64). > Thus IPC_64 is redefined for newer kernels on affected ABIs. > > 2. semtimedop and semop does not exist on 32-bit ABIs (only > semtimedop_time64 is supplied). The provided syscall wrappers only > uses the wire-up syscall if __NR_semtimedop and __NR_semop are > also defined. > > Checked on x86_64-linux-gnu and i686-linux-gnu on both a 4.15 kernel > configure with default options and sysvipc tests on a 5.1.2 kernel with > --enable-kernel=5.1. > > I also checked the sysvipc tests on alpha, hppa, mips (32, 64, and n32), > powerpc (32, 64, 64le), sparc (32, 64), and s390 (32, 64). Thanks for putting this patchset together, Adhemerval! I tested a bare minimum to see if the goal for my original patches had been met, and indeed it has. A no-op (error case) msgctl() is about 7% faster. I added a similar test for semop, too, since that's a special case, and that's about 10% faster. I don't know if my trivial testing qualifies for a "Tested-by", but you are welcome to use this as such if you wish: Tested-by: Paul A. Clarke <pc@us.ibm.com> PC
On 15/10/2019 16:10, Paul Clarke wrote: > On 10/11/19 2:15 PM, Adhemerval Zanella wrote: >> Linux 5.1 adds missing SySV IPC syscalls to the syscall table for >> remanining one that still uses the ipc syscall on glibc (m68k, mips-o32, >> powerpc, s390, sh, and sparc32). However the newly added direct ipc >> syscall are different than the old ones: >> >> 1. They do not expect IPC_64, meaning __IPC_64 should be set to zero >> when new syscalls are used. And new syscalls can not be used >> for compat functions like __old_semctl (to emulated old sysvipc it >> requires to use the old __NR_ipc syscall without __IPC_64). >> Thus IPC_64 is redefined for newer kernels on affected ABIs. >> >> 2. semtimedop and semop does not exist on 32-bit ABIs (only >> semtimedop_time64 is supplied). The provided syscall wrappers only >> uses the wire-up syscall if __NR_semtimedop and __NR_semop are >> also defined. >> >> Checked on x86_64-linux-gnu and i686-linux-gnu on both a 4.15 kernel >> configure with default options and sysvipc tests on a 5.1.2 kernel with >> --enable-kernel=5.1. >> >> I also checked the sysvipc tests on alpha, hppa, mips (32, 64, and n32), >> powerpc (32, 64, 64le), sparc (32, 64), and s390 (32, 64). > > Thanks for putting this patchset together, Adhemerval! > > I tested a bare minimum to see if the goal for my original patches had been met, and indeed it has. A no-op (error case) msgctl() is about 7% faster. I added a similar test for semop, too, since that's a special case, and that's about 10% faster. > > I don't know if my trivial testing qualifies for a "Tested-by", but you are welcome to use this as such if you wish: > Tested-by: Paul A. Clarke <pc@us.ibm.com> > > PC > Thanks for checking on powerpc, I also rechecked on i686-linux as well. I will commit this shortly.
diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h index 33ba18e791..9db3b3a31c 100644 --- a/sysdeps/unix/sysv/linux/i386/kernel-features.h +++ b/sysdeps/unix/sysv/linux/i386/kernel-features.h @@ -43,9 +43,11 @@ # undef __ASSUME_SENDTO_SYSCALL #endif -/* i686 only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* i686 only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS 1 diff --git a/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/sysdeps/unix/sysv/linux/m68k/kernel-features.h index 7ff9b5e28d..76f90ff8b4 100644 --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h @@ -50,7 +50,9 @@ # undef __ASSUME_SET_ROBUST_LIST #endif -/* m68k only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +/* m68k only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #define __ASSUME_SYSVIPC_BROKEN_MODE_T -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h index 7123b362ee..ad5b1ace82 100644 --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h @@ -31,8 +31,12 @@ pairs to start with an even-number register. */ #if _MIPS_SIM == _ABIO32 # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 -/* mips32 only supports ipc syscall. */ -# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +/* mips32 only supports ipc syscall before 5.1. */ +# if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +# else +# endif /* The o32 MIPS fadvise64 syscall behaves as fadvise64_64. */ # define __ASSUME_FADVISE64_AS_64_64 1 @@ -40,6 +44,8 @@ /* mips32 support wire-up network syscalls. */ # define __ASSUME_RECV_SYSCALL 1 # define __ASSUME_SEND_SYSCALL 1 +#else +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 #endif /* Define that mips64-n32 is a ILP32 ABI to set the correct interface to @@ -50,5 +56,3 @@ #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS 1 - -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c index 19d5ded19f..71b89c1153 100644 --- a/sysdeps/unix/sysv/linux/msgctl.c +++ b/sysdeps/unix/sysv/linux/msgctl.c @@ -111,7 +111,11 @@ int attribute_compat_text_section __old_msgctl (int msqid, int cmd, struct __old_msqid_ds *buf) { -#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS \ + && !defined __ASSUME_SYSVIPC_DEFAULT_IPC_64 + /* For architecture that have wire-up msgctl but also have __IPC_64 to a + value different than default (0x0), it means the old syscall was done + using __NR_ipc. */ return INLINE_SYSCALL_CALL (msgctl, msqid, cmd, buf); #else return INLINE_SYSCALL_CALL (ipc, IPCOP_msgctl, msqid, cmd, 0, buf); diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h index b93f7f8f13..96a2c4b2aa 100644 --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h @@ -44,9 +44,11 @@ #include_next <kernel-features.h> -/* powerpc only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* powerpc only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS 1 diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h index f1f8dad305..0fbd16ab85 100644 --- a/sysdeps/unix/sysv/linux/s390/kernel-features.h +++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h @@ -45,12 +45,14 @@ # undef __ASSUME_SENDTO_SYSCALL #endif -/* s390 only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +/* s390 only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #ifndef __s390x__ # define __ASSUME_SYSVIPC_BROKEN_MODE_T #endif -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS2 diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c index e7f48e4093..9444515537 100644 --- a/sysdeps/unix/sysv/linux/semctl.c +++ b/sysdeps/unix/sysv/linux/semctl.c @@ -168,7 +168,11 @@ __old_semctl (int semid, int semnum, int cmd, ...) break; } -# ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS \ + && !defined __ASSUME_SYSVIPC_DEFAULT_IPC_64 + /* For architecture that have wire-up semctl but also have __IPC_64 to a + value different than default (0x0), it means the old syscall was done + using __NR_ipc. */ return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd, arg.array); # else return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd, diff --git a/sysdeps/unix/sysv/linux/semtimedop.c b/sysdeps/unix/sysv/linux/semtimedop.c index 5f1b205c2b..eade9ec36a 100644 --- a/sysdeps/unix/sysv/linux/semtimedop.c +++ b/sysdeps/unix/sysv/linux/semtimedop.c @@ -27,7 +27,9 @@ int __semtimedop (int semid, struct sembuf *sops, size_t nsops, const struct timespec *timeout) { -#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS + /* semtimedop wire-up syscall is not exported for 32-bit ABIs (they have + semtimedop_time64 instead with uses a 64-bit time_t). */ +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS && defined __NR_semtimedop return INLINE_SYSCALL_CALL (semtimedop, semid, sops, nsops, timeout); #else return INLINE_SYSCALL_CALL (ipc, IPCOP_semtimedop, semid, diff --git a/sysdeps/unix/sysv/linux/sh/kernel-features.h b/sysdeps/unix/sysv/linux/sh/kernel-features.h index dce9d41653..e9048a6474 100644 --- a/sysdeps/unix/sysv/linux/sh/kernel-features.h +++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h @@ -43,12 +43,14 @@ before the offset. */ #define __ASSUME_PRW_DUMMY_ARG 1 -/* sh only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +/* sh only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #if __BYTE_ORDER == __BIG_ENDIAN # define __ASSUME_SYSVIPC_BROKEN_MODE_T #endif -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 /* Support for several syscalls was added in 4.8. */ #if __LINUX_KERNEL_VERSION < 0x040800 diff --git a/sysdeps/unix/sysv/linux/shmctl.c b/sysdeps/unix/sysv/linux/shmctl.c index 606c8dcd6b..c4b6d06360 100644 --- a/sysdeps/unix/sysv/linux/shmctl.c +++ b/sysdeps/unix/sysv/linux/shmctl.c @@ -111,7 +111,11 @@ int attribute_compat_text_section __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf) { -#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS \ + && !defined __ASSUME_SYSVIPC_DEFAULT_IPC_64 + /* For architecture that have wire-up shmctl but also have __IPC_64 to a + value different than default (0x0), it means the old syscall was done + using __NR_ipc. */ return INLINE_SYSCALL_CALL (shmctl, shmid, cmd, buf); #else return INLINE_SYSCALL_CALL (ipc, IPCOP_shmctl, shmid, cmd, 0, buf); diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h index 25194117f6..ea9a2a8212 100644 --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h @@ -58,10 +58,12 @@ # undef __NR_pause #endif -/* sparc only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#ifndef __arch64__ -# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* sparc only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# if !defined __arch64__ +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +# endif #endif /* Support for the renameat2 syscall was added in 3.16. */