[PATCH 1/3] ipc: Refactor sysvipc internal definitions

classic Classic list List threaded Threaded
12 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH 1/3] ipc: Refactor sysvipc internal definitions

Adhemerval Zanella-2
This patch refactor the internal sysvipc in two main points:

  1. Add a new __ASSUME_SYSVIPC_DEFAULT_IPC_64 to infer the __IPC_64
     value in wire-up or ipc syscall.  The defaut value assumed for
     __IPC_64 is also changed from 0x100 to 0x0, aligning with Linux
     generic UAPI.  The idea is to simplify the Linux 5.1 wire-up for
     sysvipc syscalls for some 32-bit ABIs (which expectes __IPC_64
     being 0x0) and simplify new ports (which would not require add
     a ipc_priv.h to override the __IPC_64 value).

  2. It removes some duplicated definition from sysvipc compat code
     at ipc_priv.h.  The idea is also to make it simpler to enable
     the new wireup sysvipc on Linux v5.1.

There is no semantic change expected on any port.  Checked with a build
against all affected ABIs.

        * sysdeps/unix/sysv/linux/ipc_priv.h  (__OLD_IPC_ID_TYPE,
        __OLD_IPC_MODE_TYPE, __OLD_IPC_SEQ_TYPE): Define.
        (__old_ipc_perm): Use the new defines.
        * sysdeps/unix/sysv/linux/alpha/ipc_priv.h (__OLD_IPC_ID_TYPE,
        __OLD_IPC_MODE_TYPE, __OLD_IPC_SEQ_TYPE): Define.
        (__old_ipc_perm): Use the new defines.
        * sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h (__OLD_IPC_ID_TYPE,
        __OLD_IPC_MODE_TYPE, __OLD_IPC_SEQ_TYPE): Define.
        (__old_ipc_perm): Use the new defines.
        * sysdeps/unix/sysv/linux/powerpc/ipc_priv.h (__OLD_IPC_ID_TYPE,
        __OLD_IPC_MODE_TYPE, __OLD_IPC_SEQ_TYPE): Define.
        (__old_ipc_perm): Use the new defines.
        * sysdeps/unix/sysv/linux/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Define.
        * sysdeps/unix/sysv/linux/alpha/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Undefine.
        * sysdeps/unix/sysv/linux/arm/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/i386/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/m68k/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/mips/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/microblaze/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/powerpc/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/s390/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/sh/kernel-features.h
        (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/sparc/kernel-features.h
        [!__arch64__] (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise.
        * sysdeps/unix/sysv/linux/nios2/kernel-features.h: New file.
        * sysdeps/unix/sysv/linux/hppa/ipc_priv.h: Remove file.
        * sysdeps/unix/sysv/linux/ia64/ipc_priv.h: Likewise.
        * sysdeps/unix/sysv/linux/nios2/ipc_priv.h: Likewise.
        * sysdeps/unix/sysv/linux/csky/ipc_priv.h: Likewise.
        * sysdeps/unix/sysv/linux/riscv/ipc_priv.h: Likewise.
        * sysdeps/unix/sysv/linux/sparc/sparc64/ipc_priv.h: Likewise.
        * sysdeps/unix/sysv/linux/x86_64/ipc_priv.h: Likewise.
---
 sysdeps/unix/sysv/linux/alpha/ipc_priv.h      | 18 +++--------
 .../unix/sysv/linux/alpha/kernel-features.h   |  3 ++
 sysdeps/unix/sysv/linux/arm/kernel-features.h |  2 ++
 sysdeps/unix/sysv/linux/hppa/ipc_priv.h       | 21 ------------
 .../unix/sysv/linux/i386/kernel-features.h    |  1 +
 sysdeps/unix/sysv/linux/ia64/ipc_priv.h       | 21 ------------
 sysdeps/unix/sysv/linux/ipc_priv.h            | 31 +++++++++++++-----
 sysdeps/unix/sysv/linux/kernel-features.h     |  3 ++
 .../unix/sysv/linux/m68k/kernel-features.h    |  1 +
 .../sysv/linux/microblaze/kernel-features.h   |  1 +
 .../unix/sysv/linux/mips/kernel-features.h    |  2 ++
 .../unix/sysv/linux/mips/mips64/ipc_priv.h    | 18 +++--------
 sysdeps/unix/sysv/linux/nios2/ipc_priv.h      | 21 ------------
 .../ipc_priv.h => nios2/kernel-features.h}    |  9 +++---
 sysdeps/unix/sysv/linux/powerpc/ipc_priv.h    | 28 +++-------------
 .../unix/sysv/linux/powerpc/kernel-features.h |  1 +
 sysdeps/unix/sysv/linux/riscv/ipc_priv.h      | 21 ------------
 .../unix/sysv/linux/s390/kernel-features.h    |  1 +
 sysdeps/unix/sysv/linux/sh/kernel-features.h  |  1 +
 .../unix/sysv/linux/sparc/kernel-features.h   |  3 ++
 .../unix/sysv/linux/sparc/sparc64/ipc_priv.h  | 20 ++++--------
 sysdeps/unix/sysv/linux/x86_64/ipc_priv.h     | 32 -------------------
 22 files changed, 65 insertions(+), 194 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/hppa/ipc_priv.h
 delete mode 100644 sysdeps/unix/sysv/linux/ia64/ipc_priv.h
 delete mode 100644 sysdeps/unix/sysv/linux/nios2/ipc_priv.h
 rename sysdeps/unix/sysv/linux/{csky/ipc_priv.h => nios2/kernel-features.h} (75%)
 delete mode 100644 sysdeps/unix/sysv/linux/riscv/ipc_priv.h
 delete mode 100644 sysdeps/unix/sysv/linux/x86_64/ipc_priv.h

diff --git a/sysdeps/unix/sysv/linux/alpha/ipc_priv.h b/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
index 881d943063..0bf9da5694 100644
--- a/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
+++ b/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
@@ -16,17 +16,7 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x100
-
-struct __old_ipc_perm
-{
-  __key_t __key; /* Key.  */
-  unsigned int uid; /* Owner's user ID.  */
-  unsigned int gid; /* Owner's group ID.  */
-  unsigned int cuid; /* Creator's user ID.  */
-  unsigned int cgid; /* Creator's group ID.  */
-  unsigned int mode; /* Read/write permission.  */
-  unsigned short int __seq; /* Sequence number.  */
-};
+#define __OLD_IPC_ID_TYPE   unsigned int
+#define __OLD_IPC_MODE_TYPE unsigned int
+#define __OLD_IPC_SEQ_TYPE  unsigned short int
+#include <sysdeps/unix/sysv/linux/ipc_priv.h>
diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
index 3928b4b62c..ac127adff7 100644
--- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
@@ -52,4 +52,7 @@
 # undef __ASSUME_STATX
 #endif
 
+/* Alpha support old sysvipc even being a 64-bit architecture.  */
+#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
+
 #endif /* _KERNEL_FEATURES_H */
diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h
index 6b32970e2b..d66f3a4ab7 100644
--- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
@@ -54,3 +54,5 @@
 #if __BYTE_ORDER == __BIG_ENDIAN
 # define __ASSUME_SYSVIPC_BROKEN_MODE_T
 #endif
+
+#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
diff --git a/sysdeps/unix/sysv/linux/hppa/ipc_priv.h b/sysdeps/unix/sysv/linux/hppa/ipc_priv.h
deleted file mode 100644
index a52e2c7b37..0000000000
--- a/sysdeps/unix/sysv/linux/hppa/ipc_priv.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Old SysV permission definition for Linux.  Hppa version.
-   Copyright (C) 2017-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x0
diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h
index 8e982c41e6..33ba18e791 100644
--- a/sysdeps/unix/sysv/linux/i386/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/i386/kernel-features.h
@@ -45,6 +45,7 @@
 
 /* i686 only supports ipc syscall.  */
 #undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE_BACKWARDS 1
diff --git a/sysdeps/unix/sysv/linux/ia64/ipc_priv.h b/sysdeps/unix/sysv/linux/ia64/ipc_priv.h
deleted file mode 100644
index 29451a379a..0000000000
--- a/sysdeps/unix/sysv/linux/ia64/ipc_priv.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Old SysV permission definition for Linux.  IA64 version.
-   Copyright (C) 2017-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x0
diff --git a/sysdeps/unix/sysv/linux/ipc_priv.h b/sysdeps/unix/sysv/linux/ipc_priv.h
index deae555bfb..20c6873d94 100644
--- a/sysdeps/unix/sysv/linux/ipc_priv.h
+++ b/sysdeps/unix/sysv/linux/ipc_priv.h
@@ -17,18 +17,33 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x100
+#include <kernel-features.h>
+
+#ifdef __ASSUME_SYSVIPC_DEFAULT_IPC_64
+# define __IPC_64      0x0
+#else
+# define __IPC_64      0x100
+#endif
+
+#ifndef __OLD_IPC_ID_TYPE
+# define __OLD_IPC_ID_TYPE unsigned short int
+#endif
+#ifndef __OLD_IPC_MODE_TYPE
+# define __OLD_IPC_MODE_TYPE unsigned short int
+#endif
+#ifndef __OLD_IPC_SEQ_TYPE
+# define __OLD_IPC_SEQ_TYPE unsigned short int
+#endif
 
 struct __old_ipc_perm
 {
   __key_t __key; /* Key.  */
-  unsigned short int uid; /* Owner's user ID.  */
-  unsigned short int gid; /* Owner's group ID.  */
-  unsigned short int cuid; /* Creator's user ID.  */
-  unsigned short int cgid; /* Creator's group ID.  */
-  unsigned short int mode; /* Read/write permission.  */
-  unsigned short int __seq; /* Sequence number.  */
+  __OLD_IPC_ID_TYPE uid; /* Owner's user ID.  */
+  __OLD_IPC_ID_TYPE gid; /* Owner's group ID.  */
+  __OLD_IPC_ID_TYPE cuid; /* Creator's user ID.  */
+  __OLD_IPC_ID_TYPE cgid; /* Creator's group ID.  */
+  __OLD_IPC_MODE_TYPE mode; /* Read/write permission.  */
+  __OLD_IPC_SEQ_TYPE __seq; /* Sequence number.  */
 };
 
 #define SEMCTL_ARG_ADDRESS(__arg) &__arg.array
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
index 7305686081..e6be76ff46 100644
--- a/sysdeps/unix/sysv/linux/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
@@ -85,6 +85,9 @@
 /* Support for SysV IPC through wired syscalls.  All supported architectures
    either support ipc syscall and/or all the ipc correspondent syscalls.  */
 #define __ASSUME_DIRECT_SYSVIPC_SYSCALLS 1
+/* The generic default __IPC_64 value is 0x0, however some architectures
+   require a different value of 0x100.  */
+#define __ASSUME_SYSVIPC_DEFAULT_IPC_64 1
 
 /* All supported architectures reserve a 32-bit for MODE field in sysvipc
    ipc_perm.  However, some kernel ABI interfaces still expect a 16-bit
diff --git a/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
index becc05d4dd..7ff9b5e28d 100644
--- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
@@ -53,3 +53,4 @@
 /* m68k only supports ipc syscall.  */
 #undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
 #define __ASSUME_SYSVIPC_BROKEN_MODE_T
+#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
diff --git a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
index 19c77a42bd..2dd9810f93 100644
--- a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
@@ -72,3 +72,4 @@
 #if __BYTE_ORDER == __BIG_ENDIAN
 # define __ASSUME_SYSVIPC_BROKEN_MODE_T
 #endif
+#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 a284417253..7123b362ee 100644
--- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
@@ -50,3 +50,5 @@
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE_BACKWARDS 1
+
+#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h b/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
index 10d5c52dd0..459ee3d2e7 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
+++ b/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
@@ -16,17 +16,7 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <sys/ipc.h>
-
-#define __IPC_64 0x100
-
-struct __old_ipc_perm
-{
-  __key_t __key; /* Key.  */
-  int uid; /* Owner's user ID.  */
-  int gid; /* Owner's group ID.  */
-  int cuid; /* Creator's user ID.  */
-  int cgid; /* Creator's group ID.  */
-  int mode; /* Read/write permission.  */
-  unsigned short int __seq; /* Sequence number.  */
-};
+#define __OLD_IPC_ID_TYPE    int
+#define __OLD_IPC_MODE_TYPE  int
+#define __OLD_IPC_SEQ_TYPE   unsigned short int
+#include <sysdeps/unix/sysv/linux/ipc_priv.h>
diff --git a/sysdeps/unix/sysv/linux/nios2/ipc_priv.h b/sysdeps/unix/sysv/linux/nios2/ipc_priv.h
deleted file mode 100644
index 7e15313999..0000000000
--- a/sysdeps/unix/sysv/linux/nios2/ipc_priv.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Old SysV permission definition for Linux.  Nios II version.
-   Copyright (C) 2017-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x0
diff --git a/sysdeps/unix/sysv/linux/csky/ipc_priv.h b/sysdeps/unix/sysv/linux/nios2/kernel-features.h
similarity index 75%
rename from sysdeps/unix/sysv/linux/csky/ipc_priv.h
rename to sysdeps/unix/sysv/linux/nios2/kernel-features.h
index e8e8a256ea..c95e7051d9 100644
--- a/sysdeps/unix/sysv/linux/csky/ipc_priv.h
+++ b/sysdeps/unix/sysv/linux/nios2/kernel-features.h
@@ -1,5 +1,6 @@
-/* Old SysV permission definition for Linux.  C-SKY version.
-   Copyright (C) 2017-2019 Free Software Foundation, Inc.
+/* Set flags signalling availability of kernel features based on given
+   kernel version number.  NIOS2 version.
+   Copyright (C) 2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,6 +17,6 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <sys/ipc.h>  /* For __key_t  */
+#include_next <kernel-features.h>
 
-#define __IPC_64 0x0
+#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
diff --git a/sysdeps/unix/sysv/linux/powerpc/ipc_priv.h b/sysdeps/unix/sysv/linux/powerpc/ipc_priv.h
index 96372bc9ad..a8ebf23cd2 100644
--- a/sysdeps/unix/sysv/linux/powerpc/ipc_priv.h
+++ b/sysdeps/unix/sysv/linux/powerpc/ipc_priv.h
@@ -16,27 +16,7 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x100
-
-struct __old_ipc_perm
-{
-  __key_t __key; /* Key.  */
-  unsigned int uid; /* Owner's user ID.  */
-  unsigned int gid; /* Owner's group ID.  */
-  unsigned int cuid; /* Creator's user ID.  */
-  unsigned int cgid; /* Creator's group ID.  */
-  unsigned int mode; /* Read/write permission.  */
-  unsigned short int __seq; /* Sequence number.  */
-};
-
-#define SEMCTL_ARG_ADDRESS(__arg) &__arg.array
-
-#define MSGRCV_ARGS(__msgp, __msgtyp) \
-  ((long int []){ (long int) __msgp, __msgtyp })
-
-#define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
-  (__nsops), 0, (__sops), (__timeout)
-
-#include <ipc_ops.h>
+#define __OLD_IPC_ID_TYPE    unsigned int
+#define __OLD_IPC_MODE_TYPE  unsigned int
+#define __OLD_IPC_SEQ_TYPE   unsigned short int
+#include <sysdeps/unix/sysv/linux/ipc_priv.h>
diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
index d177a91ab3..b93f7f8f13 100644
--- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
@@ -46,6 +46,7 @@
 
 /* powerpc only supports ipc syscall.  */
 #undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE_BACKWARDS 1
diff --git a/sysdeps/unix/sysv/linux/riscv/ipc_priv.h b/sysdeps/unix/sysv/linux/riscv/ipc_priv.h
deleted file mode 100644
index dd755a9f2c..0000000000
--- a/sysdeps/unix/sysv/linux/riscv/ipc_priv.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Old SysV permission definition for Linux.  RISC-V version.
-   Copyright (C) 2018-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x0
diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h
index 6dca32c6c7..f1f8dad305 100644
--- a/sysdeps/unix/sysv/linux/s390/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h
@@ -50,6 +50,7 @@
 #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/sh/kernel-features.h b/sysdeps/unix/sysv/linux/sh/kernel-features.h
index fae54c8df5..dce9d41653 100644
--- a/sysdeps/unix/sysv/linux/sh/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h
@@ -48,6 +48,7 @@
 #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/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
index c523461d95..25194117f6 100644
--- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
@@ -60,6 +60,9 @@
 
 /* sparc only supports ipc syscall.  */
 #undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#ifndef __arch64__
+# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
+#endif
 
 /* Support for the renameat2 syscall was added in 3.16.  */
 #if __LINUX_KERNEL_VERSION < 0x031000
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ipc_priv.h b/sysdeps/unix/sysv/linux/sparc/sparc64/ipc_priv.h
index 00f8510056..414755f15a 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/ipc_priv.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/ipc_priv.h
@@ -16,26 +16,18 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x0
-
-struct __old_ipc_perm
-{
-  __key_t __key; /* Key.  */
-  unsigned int uid; /* Owner's user ID.  */
-  unsigned int gid; /* Owner's group ID.  */
-  unsigned int cuid; /* Creator's user ID.  */
-  unsigned int cgid; /* Creator's group ID.  */
-  unsigned int mode; /* Read/write permission.  */
-  unsigned short int __seq; /* Sequence number.  */
-};
+#define __OLD_IPC_ID_TYPE   unsigned int
+#define __OLD_IPC_MODE_TYPE unsigned int
+#define __OLD_IPC_SEQ_TYPE  unsigned short int
+#include <sysdeps/unix/sysv/linux/ipc_priv.h>
 
 /* SPARC semctl multiplex syscall expects the union pointed address, not
    the union address itself.  */
+#undef SEMCTL_ARG_ADDRESS
 #define SEMCTL_ARG_ADDRESS(__arg) __arg.array
 
 /* Also for msgrcv it does not use the kludge on final 2 arguments.  */
+#undef MSGRCV_ARGS
 #define MSGRCV_ARGS(__msgp, __msgtyp) __msgp, __msgtyp
 
 #define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
diff --git a/sysdeps/unix/sysv/linux/x86_64/ipc_priv.h b/sysdeps/unix/sysv/linux/x86_64/ipc_priv.h
deleted file mode 100644
index e89c9b56c5..0000000000
--- a/sysdeps/unix/sysv/linux/x86_64/ipc_priv.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Old SysV permission definition for Linux.  x86_64 version.
-   Copyright (C) 2016-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sys/ipc.h>  /* For __key_t  */
-
-#define __IPC_64 0x0
-
-struct __old_ipc_perm
-{
-  __key_t __key; /* Key.  */
-  unsigned short uid; /* Owner's user ID.  */
-  unsigned short gid; /* Owner's group ID.  */
-  unsigned short cuid; /* Creator's user ID.  */
-  unsigned short cgid; /* Creator's group ID.  */
-  unsigned short mode; /* Read/write permission.  */
-  unsigned short int __seq; /* Sequence number.  */
-};
--
2.17.1

Reply | Threaded
Open this post in threaded view
|

[PATCH 2/3] sysvipc: Implement semop based on semtimedop

Adhemerval Zanella-2
Besides semop being a subset of semtimedop, new 32-bit architectures
on Linux are not expected to provide the syscall (only the 64-bit time
semtimedop).

Also, Linux 5.1 only wired-up semtimedop for the 64-bit architectures
that missed it (powerpc, s390, and sparc).  This simplifies the code
to support it.

Checked on x86_64-linux-gnu and i686-linux-gnu.

        * include/sys/sem.h: New file.
        * sysdeps/unix/sysv/linux/semop.c (semop): Call internal semtimedop.
        * sysdeps/unix/sysv/linux/semtimedop.c (semtimedop): Add internal
        alias.
        * sysvipc/semtimedop.c (semtimedop): Likewise.
---
 include/sys/sem.h                    | 11 ++++++++++-
 sysdeps/unix/sysv/linux/semop.c      |  6 +-----
 sysdeps/unix/sysv/linux/semtimedop.c |  6 ++++--
 sysvipc/semtimedop.c                 |  6 ++++--
 4 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/include/sys/sem.h b/include/sys/sem.h
index b0fb201bd0..bab548c3f7 100644
--- a/include/sys/sem.h
+++ b/include/sys/sem.h
@@ -1 +1,10 @@
-#include <sysvipc/sys/sem.h>
+#ifndef _SYS_SEM_H
+# include <sysvipc/sys/sem.h>
+
+# ifndef _ISOMAC
+
+__typeof__ (semtimedop) __semtimedop attribute_hidden;
+libc_hidden_proto (__semtimedop)
+
+# endif
+#endif
diff --git a/sysdeps/unix/sysv/linux/semop.c b/sysdeps/unix/sysv/linux/semop.c
index 687fdcb805..e111b9aa3d 100644
--- a/sysdeps/unix/sysv/linux/semop.c
+++ b/sysdeps/unix/sysv/linux/semop.c
@@ -26,9 +26,5 @@
 int
 semop (int semid, struct sembuf *sops, size_t nsops)
 {
-#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-  return INLINE_SYSCALL_CALL (semop, semid, sops, nsops);
-#else
-  return INLINE_SYSCALL_CALL (ipc, IPCOP_semop, semid, nsops, 0, sops);
-#endif
+  return __semtimedop (semid, sops, nsops, NULL);
 }
diff --git a/sysdeps/unix/sysv/linux/semtimedop.c b/sysdeps/unix/sysv/linux/semtimedop.c
index f34a7fb920..5f1b205c2b 100644
--- a/sysdeps/unix/sysv/linux/semtimedop.c
+++ b/sysdeps/unix/sysv/linux/semtimedop.c
@@ -24,8 +24,8 @@
 /* Perform user-defined atomical operation of array of semaphores.  */
 
 int
-semtimedop (int semid, struct sembuf *sops, size_t nsops,
-    const struct timespec *timeout)
+__semtimedop (int semid, struct sembuf *sops, size_t nsops,
+      const struct timespec *timeout)
 {
 #ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
   return INLINE_SYSCALL_CALL (semtimedop, semid, sops, nsops, timeout);
@@ -34,3 +34,5 @@ semtimedop (int semid, struct sembuf *sops, size_t nsops,
       SEMTIMEDOP_IPC_ARGS (nsops, sops, timeout));
 #endif
 }
+weak_alias (__semtimedop, semtimedop)
+libc_hidden_def (__semtimedop)
diff --git a/sysvipc/semtimedop.c b/sysvipc/semtimedop.c
index 5ca4d47ee3..68707d6ade 100644
--- a/sysvipc/semtimedop.c
+++ b/sysvipc/semtimedop.c
@@ -22,11 +22,13 @@
 /* Perform user-defined atomical operation of array of semaphores.  */
 
 int
-semtimedop (int semid, struct sembuf *sops, size_t nsops,
-    const struct timespec *timeout)
+__semtimedop (int semid, struct sembuf *sops, size_t nsops,
+      const struct timespec *timeout)
 {
   __set_errno (ENOSYS);
   return -1;
 }
+weak_alias (__semtimedop, semtimedop)
+libc_hidden_def (__semtimedop)
 
 stub_warning (semtimedop)
--
2.17.1

Reply | Threaded
Open this post in threaded view
|

[PATCH 3/3] Update sysvipc kernel-features.h files for Linux 5.1

Adhemerval Zanella-2
In reply to this post by Adhemerval Zanella-2
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(-)

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.  */
--
2.17.1

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/3] ipc: Refactor sysvipc internal definitions

Florian Weimer-5
In reply to this post by Adhemerval Zanella-2
* Adhemerval Zanella:

> This patch refactor the internal sysvipc in two main points:
>
>   1. Add a new __ASSUME_SYSVIPC_DEFAULT_IPC_64 to infer the __IPC_64
>      value in wire-up or ipc syscall.  The defaut value assumed for

Sorry, would you please re-phrase?  I don't understand the wire-up
terminology in this context.

>      __IPC_64 is also changed from 0x100 to 0x0, aligning with Linux
>      generic UAPI.  The idea is to simplify the Linux 5.1 wire-up for
>      sysvipc syscalls for some 32-bit ABIs (which expectes __IPC_64
>      being 0x0) and simplify new ports (which would not require add
>      a ipc_priv.h to override the __IPC_64 value).

Replace “would not required add a ipc_priv.h” with “will no longer need
to add ipc_priv.h”?


>   2. It removes some duplicated definition from sysvipc compat code
>      at ipc_priv.h.  The idea is also to make it simpler to enable
>      the new wireup sysvipc on Linux v5.1.

Again, I don't understand this terminology.

> diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> index 3928b4b62c..ac127adff7 100644
> --- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> @@ -52,4 +52,7 @@
>  # undef __ASSUME_STATX
>  #endif
>  
> +/* Alpha support old sysvipc even being a 64-bit architecture.  */
> +#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64

s/support/requires/?

> diff --git a/sysdeps/unix/sysv/linux/alpha/ipc_priv.h b/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
> index 881d943063..0bf9da5694 100644
> --- a/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
> +++ b/sysdeps/unix/sysv/linux/alpha/ipc_priv.h

> +#define __OLD_IPC_SEQ_TYPE  unsigned short int
> +#include <sysdeps/unix/sysv/linux/ipc_priv.h>

Isn't that the __OLD_IPC_SEQ_TYPE default?  (This applies to other
architectures as well.

In fact, __OLD_IPC_SEQ_TYPE appears to be unsighed short int always, so
I think it shouldn't be parameterized.

> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h b/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
> index 10d5c52dd0..459ee3d2e7 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h

> +#define __OLD_IPC_SEQ_TYPE   unsigned short int
> +#include <sysdeps/unix/sysv/linux/ipc_priv.h>

See above.

Rest looks okay to me.

Thanks,
Florian
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 3/3] Update sysvipc kernel-features.h files for Linux 5.1

Paul Clarke
In reply to this post by Adhemerval Zanella-2
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 <[hidden email]>

PC
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/3] ipc: Refactor sysvipc internal definitions

Adhemerval Zanella-2
In reply to this post by Florian Weimer-5


On 15/10/2019 08:45, Florian Weimer wrote:
> * Adhemerval Zanella:
>
>> This patch refactor the internal sysvipc in two main points:
>>
>>   1. Add a new __ASSUME_SYSVIPC_DEFAULT_IPC_64 to infer the __IPC_64
>>      value in wire-up or ipc syscall.  The defaut value assumed for
>
> Sorry, would you please re-phrase?  I don't understand the wire-up
> terminology in this context.

The 'wire-up' here means the syscall is done by its own entrypoint defined
by a __NR_ number instead of a multiplexed one, in this case the __NR_ipc.
Maybe the following is more clear:

  1. Add a new __ASSUME_SYSVIPC_DEFAULT_IPC_64 to infer the __IPC_64
     value to be used along either the multiplexed __NR_ipc or wired-up
     syscall.


>
>>      __IPC_64 is also changed from 0x100 to 0x0, aligning with Linux
>>      generic UAPI.  The idea is to simplify the Linux 5.1 wire-up for
>>      sysvipc syscalls for some 32-bit ABIs (which expectes __IPC_64
>>      being 0x0) and simplify new ports (which would not require add
>>      a ipc_priv.h to override the __IPC_64 value).
>
> Replace “would not required add a ipc_priv.h” with “will no longer need
> to add ipc_priv.h”?

Ack.

>
>
>>   2. It removes some duplicated definition from sysvipc compat code
>>      at ipc_priv.h.  The idea is also to make it simpler to enable
>>      the new wireup sysvipc on Linux v5.1.
>
> Again, I don't understand this terminology.

This idea is to consolidate the __old_ipc_perm and other arch-specific
definitions that are duplicated over the architectures. Maybe:

  2. It also removed some duplicated internal definition used on compat
     sysvipc symbols defined at ipc_priv.h (more specifically the
     __old_ipc_perm, SEMCTL_ARG_ADDRESS, MSGRCV_ARGS, and SEMTIMEDOP_IPC_ARGS).
     The idea is also to make it simpler to enable the new wire-up sysvipc
     syscall provided by Linux v5.1.

>
>> diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
>> index 3928b4b62c..ac127adff7 100644
>> --- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
>> @@ -52,4 +52,7 @@
>>  # undef __ASSUME_STATX
>>  #endif
>>  
>> +/* Alpha support old sysvipc even being a 64-bit architecture.  */
>> +#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
>
> s/support/requires/?

Ack.

>
>> diff --git a/sysdeps/unix/sysv/linux/alpha/ipc_priv.h b/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
>> index 881d943063..0bf9da5694 100644
>> --- a/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
>> +++ b/sysdeps/unix/sysv/linux/alpha/ipc_priv.h
>
>> +#define __OLD_IPC_SEQ_TYPE  unsigned short int
>> +#include <sysdeps/unix/sysv/linux/ipc_priv.h>
>
> Isn't that the __OLD_IPC_SEQ_TYPE default?  (This applies to other
> architectures as well.
>
> In fact, __OLD_IPC_SEQ_TYPE appears to be unsighed short int always, so
> I think it shouldn't be parameterized.

Indeed, I will remove.

>
>> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h b/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
>> index 10d5c52dd0..459ee3d2e7 100644
>> --- a/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
>> +++ b/sysdeps/unix/sysv/linux/mips/mips64/ipc_priv.h
>
>> +#define __OLD_IPC_SEQ_TYPE   unsigned short int
>> +#include <sysdeps/unix/sysv/linux/ipc_priv.h>
>
> See above.

Ack.

>
> Rest looks okay to me.
>
> Thanks,
> Florian
>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 2/3] sysvipc: Implement semop based on semtimedop

Florian Weimer-5
In reply to this post by Adhemerval Zanella-2
* Adhemerval Zanella:

> diff --git a/include/sys/sem.h b/include/sys/sem.h
> index b0fb201bd0..bab548c3f7 100644
> --- a/include/sys/sem.h
> +++ b/include/sys/sem.h
> @@ -1 +1,10 @@
> -#include <sysvipc/sys/sem.h>
> +#ifndef _SYS_SEM_H
> +# include <sysvipc/sys/sem.h>
> +
> +# ifndef _ISOMAC
> +
> +__typeof__ (semtimedop) __semtimedop attribute_hidden;
> +libc_hidden_proto (__semtimedop)

You don't need libc_hidden_proto if you use attribute_hidden.  (You also
need to drop libc_hidden_def if you don't use libc_hidden_proto.)

Rest looks fine.

Thanks,
Florian
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 2/3] sysvipc: Implement semop based on semtimedop

Joseph Myers
I'm seeing a build failure for i686-gnu I suspect is caused by this
change.

In file included from <command-line>:
./../include/libc-symbols.h:545:33: error: '__EI___semtimedop' aliased to undefined symbol '__GI___semtimedop'
   extern thread __typeof (name) __EI_##name \
                                 ^~~~~
./../include/libc-symbols.h:541:3: note: in expansion of macro '__hidden_ver2'
   __hidden_ver2 (, local, internal, name)
   ^~~~~~~~~~~~~
./../include/libc-symbols.h:550:29: note: in expansion of macro '__hidden_ver1'
 #  define hidden_def(name)  __hidden_ver1(__GI_##name, name, name);
                             ^~~~~~~~~~~~~
./../include/libc-symbols.h:619:32: note: in expansion of macro 'hidden_def'
 # define libc_hidden_def(name) hidden_def (name)
                                ^~~~~~~~~~
semtimedop.c:32:1: note: in expansion of macro 'libc_hidden_def'
 libc_hidden_def (__semtimedop)
 ^~~~~~~~~~~~~~~

https://sourceware.org/ml/libc-testresults/2019-q4/msg00085.html

--
Joseph S. Myers
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 2/3] sysvipc: Implement semop based on semtimedop

Florian Weimer-5
* Joseph Myers:

> I'm seeing a build failure for i686-gnu I suspect is caused by this
> change.
>
> In file included from <command-line>:
> ./../include/libc-symbols.h:545:33: error: '__EI___semtimedop' aliased to undefined symbol '__GI___semtimedop'
>    extern thread __typeof (name) __EI_##name \
>                                  ^~~~~
> ./../include/libc-symbols.h:541:3: note: in expansion of macro '__hidden_ver2'
>    __hidden_ver2 (, local, internal, name)
>    ^~~~~~~~~~~~~
> ./../include/libc-symbols.h:550:29: note: in expansion of macro '__hidden_ver1'
>  #  define hidden_def(name)  __hidden_ver1(__GI_##name, name, name);
>                              ^~~~~~~~~~~~~
> ./../include/libc-symbols.h:619:32: note: in expansion of macro 'hidden_def'
>  # define libc_hidden_def(name) hidden_def (name)
>                                 ^~~~~~~~~~
> semtimedop.c:32:1: note: in expansion of macro 'libc_hidden_def'
>  libc_hidden_def (__semtimedop)
>  ^~~~~~~~~~~~~~~
>
> https://sourceware.org/ml/libc-testresults/2019-q4/msg00085.html

This should fix it.

Thanks,
Florian

8<------------------------------------------------------------------8<
Subject: Remove libc_hidden_def from __semtimedop stub

This breaks the Hurd build after commit 765cdd0bffd77960ae852104f
("sysvipc: Implement semop based on semtimedop") added it to the stub.

-----
 sysvipc/semtimedop.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/sysvipc/semtimedop.c b/sysvipc/semtimedop.c
index 68707d6ade..a4b750c813 100644
--- a/sysvipc/semtimedop.c
+++ b/sysvipc/semtimedop.c
@@ -29,6 +29,5 @@ __semtimedop (int semid, struct sembuf *sops, size_t nsops,
   return -1;
 }
 weak_alias (__semtimedop, semtimedop)
-libc_hidden_def (__semtimedop)
 
 stub_warning (semtimedop)
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 2/3] sysvipc: Implement semop based on semtimedop

Joseph Myers
On Thu, 17 Oct 2019, Florian Weimer wrote:

> This should fix it.
>
> Thanks,
> Florian
>
> 8<------------------------------------------------------------------8<
> Subject: Remove libc_hidden_def from __semtimedop stub
>
> This breaks the Hurd build after commit 765cdd0bffd77960ae852104f
> ("sysvipc: Implement semop based on semtimedop") added it to the stub.

Thanks, please commit.

--
Joseph S. Myers
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 2/3] sysvipc: Implement semop based on semtimedop

Adhemerval Zanella-2
In reply to this post by Florian Weimer-5


On 17/10/2019 16:37, Florian Weimer wrote:

> * Joseph Myers:
>
>> I'm seeing a build failure for i686-gnu I suspect is caused by this
>> change.
>>
>> In file included from <command-line>:
>> ./../include/libc-symbols.h:545:33: error: '__EI___semtimedop' aliased to undefined symbol '__GI___semtimedop'
>>    extern thread __typeof (name) __EI_##name \
>>                                  ^~~~~
>> ./../include/libc-symbols.h:541:3: note: in expansion of macro '__hidden_ver2'
>>    __hidden_ver2 (, local, internal, name)
>>    ^~~~~~~~~~~~~
>> ./../include/libc-symbols.h:550:29: note: in expansion of macro '__hidden_ver1'
>>  #  define hidden_def(name)  __hidden_ver1(__GI_##name, name, name);
>>                              ^~~~~~~~~~~~~
>> ./../include/libc-symbols.h:619:32: note: in expansion of macro 'hidden_def'
>>  # define libc_hidden_def(name) hidden_def (name)
>>                                 ^~~~~~~~~~
>> semtimedop.c:32:1: note: in expansion of macro 'libc_hidden_def'
>>  libc_hidden_def (__semtimedop)
>>  ^~~~~~~~~~~~~~~
>>
>> https://sourceware.org/ml/libc-testresults/2019-q4/msg00085.html
>
> This should fix it.
>
> Thanks,
> Florian
>
> 8<------------------------------------------------------------------8<
> Subject: Remove libc_hidden_def from __semtimedop stub
>
> This breaks the Hurd build after commit 765cdd0bffd77960ae852104f
> ("sysvipc: Implement semop based on semtimedop") added it to the stub.
>
> -----
>  sysvipc/semtimedop.c | 1 -
>  1 file changed, 1 deletion(-)
>
> diff --git a/sysvipc/semtimedop.c b/sysvipc/semtimedop.c
> index 68707d6ade..a4b750c813 100644
> --- a/sysvipc/semtimedop.c
> +++ b/sysvipc/semtimedop.c
> @@ -29,6 +29,5 @@ __semtimedop (int semid, struct sembuf *sops, size_t nsops,
>    return -1;
>  }
>  weak_alias (__semtimedop, semtimedop)
> -libc_hidden_def (__semtimedop)
>  
>  stub_warning (semtimedop)
>

Ugh, I though I removed it from last iteration, thanks for catching it.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 3/3] Update sysvipc kernel-features.h files for Linux 5.1

Adhemerval Zanella-2
In reply to this post by Paul Clarke


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 <[hidden email]>
>
> PC
>

Thanks for checking on powerpc, I also rechecked on i686-linux
as well. I will commit this shortly.