[3/3] Update sysvipc kernel-features.h files for Linux 5.1
Commit Message
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).
* sysdeps/unix/sysv/linux/i386/kernel-features.h.
(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Only undefine if
[__LINUX_KERNEL_VERSION < 0x050100].
(__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
* sysdeps/unix/sysv/linux/m68k/kernel-features.h
(__ASSUME_DIRECT_SYSVIPC_SYSCALLS,
__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
* sysdeps/unix/sysv/linux/mips/kernel-features.h
(__ASSUME_DIRECT_SYSVIPC_SYSCALLS,
__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
* sysdeps/unix/sysv/linux/powerpc/kernel-features.h
(__ASSUME_DIRECT_SYSVIPC_SYSCALLS,
__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
* sysdeps/unix/sysv/linux/s390/kernel-features.h
(__ASSUME_DIRECT_SYSVIPC_SYSCALLS,
__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
* sysdeps/unix/sysv/linux/sh/kernel-features.h
(__ASSUME_DIRECT_SYSVIPC_SYSCALLS,
__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
* sysdeps/unix/sysv/linux/sparc/kernel-features.h
(__ASSUME_DIRECT_SYSVIPC_SYSCALLS,
__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
* sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Only use wire-up
syscall if __ASSUME_SYSVIPC_DEFAULT_IPC_64 is not defined.
* sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Likewise.
* sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Likewise.
* sysdeps/unix/sysv/linux/semop.c (semop): Only use wire-up if
__NR_semop is also defined.
* sysdeps/unix/sysv/linux/semtimedop.c (semtimedop): Likewise.
---
sysdeps/unix/sysv/linux/i386/kernel-features.h | 8 +++++---
sysdeps/unix/sysv/linux/m68k/kernel-features.h | 8 +++++---
sysdeps/unix/sysv/linux/mips/kernel-features.h | 12 ++++++++----
sysdeps/unix/sysv/linux/msgctl.c | 6 +++++-
sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 8 +++++---
sysdeps/unix/sysv/linux/s390/kernel-features.h | 8 +++++---
sysdeps/unix/sysv/linux/semctl.c | 6 +++++-
sysdeps/unix/sysv/linux/semtimedop.c | 4 +++-
sysdeps/unix/sysv/linux/sh/kernel-features.h | 8 +++++---
sysdeps/unix/sysv/linux/shmctl.c | 6 +++++-
sysdeps/unix/sysv/linux/sparc/kernel-features.h | 10 ++++++----
11 files changed, 57 insertions(+), 27 deletions(-)
Comments
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.
@@ -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
@@ -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
@@ -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
@@ -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);
@@ -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
@@ -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
@@ -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,
@@ -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,
@@ -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
@@ -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);
@@ -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. */