]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Consolidate Linux shmctl implementation
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 26 Oct 2016 20:20:36 +0000 (18:20 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 28 Dec 2016 22:31:05 +0000 (20:31 -0200)
This patch consolidates the shmctl Linux implementation in only
one default file, sysdeps/unix/sysv/linux/shmctl.c.  If tries to use
the direct syscall if it is supported, otherwise will use the old ipc
multiplex mechanism.

The patch also simplify header inclusion and reorganize internal
compat symbol to be built only if old ipc is defined.

Checked on x86_64, i686, powerpc64le, aarch64, and armhf.

* sysdeps/unix/sysv/linux/alpha/Makefile (sysdeps_routines): Remove
oldshmctl.
* sysdeps/unix/sysv/linux/alpha/syscalls.list (shmctl): Remove.
* sysdeps/unix/sysv/linux/arm/syscalls.list (shmctl): Likewise.
* sysdeps/unix/sysv/linux/generic/syscalls.list (shmctl): Likewise.
* sysdeps/unix/sysv/linux/hppa/syscalls.list (shmctl): Likewise.
* sysdeps/unix/sysv/linux/ia64/syscalls.list (shmctl): Likewise.
* sysdeps/unix/sysv/linux/microblaze/syscalls.list (shmctl): Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (shmctl):
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (shmctl):
Likewise.
* sysdeps/unix/sysv/linux/x86_64/syscalls.list (shmctl): Likewise.
* sysdeps/unix/sysv/linux/alpha/shmctl.c: Remove file.
* sysdeps/unix/sysv/linux/arm/shmctl.c: Likewise.
* sysdeps/unix/sysv/linux/microblaze/shmctl.c: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/shmctl.c: Use default
implementation.
* sysdeps/unix/sysv/linux/shmctl.c (__new_shmctl): Use shmctl syscall
if it is defined.

13 files changed:
ChangeLog
sysdeps/unix/sysv/linux/alpha/Makefile
sysdeps/unix/sysv/linux/alpha/shmctl.c [deleted file]
sysdeps/unix/sysv/linux/alpha/syscalls.list
sysdeps/unix/sysv/linux/arm/shmctl.c [deleted file]
sysdeps/unix/sysv/linux/generic/syscalls.list
sysdeps/unix/sysv/linux/hppa/syscalls.list
sysdeps/unix/sysv/linux/ia64/syscalls.list
sysdeps/unix/sysv/linux/microblaze/shmctl.c [deleted file]
sysdeps/unix/sysv/linux/mips/mips64/shmctl.c
sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
sysdeps/unix/sysv/linux/shmctl.c
sysdeps/unix/sysv/linux/x86_64/syscalls.list

index 2e2eb6d0a4d65cdbec5a93734966b81d1f4ad1ed..9205c82e296f8b39b19b10090da527bffb559f53 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,26 @@
 2016-12-28  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+       * sysdeps/unix/sysv/linux/alpha/Makefile (sysdeps_routines): Remove
+       oldshmctl.
+       * sysdeps/unix/sysv/linux/alpha/syscalls.list (shmctl): Remove.
+       * sysdeps/unix/sysv/linux/arm/syscalls.list (shmctl): Likewise.
+       * sysdeps/unix/sysv/linux/generic/syscalls.list (shmctl): Likewise.
+       * sysdeps/unix/sysv/linux/hppa/syscalls.list (shmctl): Likewise.
+       * sysdeps/unix/sysv/linux/ia64/syscalls.list (shmctl): Likewise.
+       * sysdeps/unix/sysv/linux/microblaze/syscalls.list (shmctl): Likewise.
+       * sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (shmctl):
+       Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (shmctl):
+       Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/syscalls.list (shmctl): Likewise.
+       * sysdeps/unix/sysv/linux/alpha/shmctl.c: Remove file.
+       * sysdeps/unix/sysv/linux/arm/shmctl.c: Likewise.
+       * sysdeps/unix/sysv/linux/microblaze/shmctl.c: Likewise.
+       * sysdeps/unix/sysv/linux/mips/mips64/shmctl.c: Use default
+       implementation.
+       * sysdeps/unix/sysv/linux/shmctl.c (__new_shmctl): Use shmctl syscall
+       if it is defined.
+
        * sysdeps/unix/sysv/linux/alpha/syscalls.list (shmat): Remove.
        * sysdeps/unix/sysv/linux/arm/syscalls.list (shmat): Likewise.
        * sysdeps/unix/sysv/linux/generic/syscalls.list (shmat): Likewise.
index 386b3fdd38f024bbe0638a2f221138071623c1db..4bbe9bf850bb1da4c83f6524cf4d3d64ca5d7479 100644 (file)
@@ -17,9 +17,6 @@ sysdep_routines += osf_select osf_gettimeofday osf_settimeofday \
                   osf_getitimer osf_setitimer osf_utimes \
                   osf_getrusage osf_wait4
 
-# Support old ipc control
-sysdep_routines += oldshmctl
-
 CFLAGS-ioperm.c = -Wa,-mev6
 endif
 
diff --git a/sysdeps/unix/sysv/linux/alpha/shmctl.c b/sysdeps/unix/sysv/linux/alpha/shmctl.c
deleted file mode 100644 (file)
index f73ed6f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/arm/shmctl.c>
index 9948d2d176ffdbbb89ef95054c8ff7096db144bf..bf9c8ad70c07e0c309e930d5fbeb4a18c3603aa7 100644 (file)
@@ -1,6 +1,5 @@
 # File name    Caller  Syscall name    # args  Strong name     Weak names
 
-oldshmctl      EXTRA   shmctl          i:iip   __old_shmctl    shmctl@GLIBC_2.0
 shmdt          -       shmdt           i:s     __shmdt         shmdt
 shmget         -       shmget          i:iii   __shmget        shmget
 
diff --git a/sysdeps/unix/sysv/linux/arm/shmctl.c b/sysdeps/unix/sysv/linux/arm/shmctl.c
deleted file mode 100644 (file)
index 23c4b8d..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 1995-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
-
-   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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <sys/shm.h>
-#include <ipc_priv.h>
-#include <sysdep.h>
-#include <sys/syscall.h>
-#include <bits/wordsize.h>
-
-
-int
-__new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
-{
-  return INLINE_SYSCALL (shmctl, 3, shmid, cmd | __IPC_64, buf);
-}
-
-#include <shlib-compat.h>
-versioned_symbol (libc, __new_shmctl, shmctl, GLIBC_2_2);
index 0df73a9e2bbfe0b2a9109c1cb36f8ebb4a27fca7..80244c4cfbd3e4d27b138514e79b21fff7dccc5f 100644 (file)
@@ -2,7 +2,6 @@
 
 # SysV APIs
 shmget         -       shmget          i:iii   __shmget        shmget
-shmctl         -       shmctl          i:iip   __shmctl        shmctl
 shmdt          -       shmdt           i:s     __shmdt         shmdt
 
 # Socket APIs
index f757f026af2e9d179cfff739a454f4eba21b0f50..d755bfd02ec6e7439f1c40efdcce915c1c86df7f 100644 (file)
@@ -1,7 +1,6 @@
 # File name    Caller  Syscall name    # args  Strong name     Weak names
 
 # semaphore and shm system calls
-shmctl         -       shmctl          i:iip   __shmctl        shmctl
 shmdt          -       shmdt           i:s     __shmdt         shmdt
 shmget         -       shmget          i:iii   __shmget        shmget
 
index b0a3a4439191180620bb2e629e5ae57de2d30681..90bd870dcf461e35fb86b3693cbbcee7d17945dd 100644 (file)
@@ -5,7 +5,6 @@ umount2         -       umount          2       __umount2       umount2
 getpriority    -       getpriority     i:ii    __getpriority   getpriority
 
 # semaphore and shm system calls
-shmctl         -       shmctl          i:iip   __shmctl        shmctl
 shmdt          -       shmdt           i:s     __shmdt         shmdt
 shmget         -       shmget          i:iii   __shmget        shmget
 
diff --git a/sysdeps/unix/sysv/linux/microblaze/shmctl.c b/sysdeps/unix/sysv/linux/microblaze/shmctl.c
deleted file mode 100644 (file)
index f73ed6f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/arm/shmctl.c>
index ea0fa94d34295f5150ad03cfaab192f3a4d2e024..f835cf88dbee722e484acb5ecb6692ba28d5e117 100644 (file)
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <sys/shm.h>
-#include <ipc_priv.h>
-#include <sysdep.h>
+#include <shlib-compat.h>
 
-int __shmctl (int shmid, int cmd, struct shmid_ds *buf);
+#undef SHLIB_COMPAT
+#define SHLIB_COMPAT(a, b, c) 0
 
-int
-__shmctl (int shmid, int cmd, struct shmid_ds *buf)
-{
-  return INLINE_SYSCALL (shmctl, 3, shmid, cmd | __IPC_64, buf);
-}
+#define DEFAULT_VERSION GLIBC_2_0
 
-#include <shlib-compat.h>
-versioned_symbol (libc, __shmctl, shmctl, GLIBC_2_0);
+#include <./sysdeps/unix/sysv/linux/shmctl.c>
index 40ed7c5b91fd80c66aa9dbb78d34a8ef4362eec9..4d478ce38cc7ab82c08b4a49fac23d7312ed6a20 100644 (file)
@@ -1,6 +1,5 @@
 # File name     Caller  Syscall name    # args  Strong name     Weak names
 
 # semaphore and shm system calls
-shmctl          -       shmctl          i:iip   __shmctl        shmctl
 shmdt           -       shmdt           i:s     __shmdt         shmdt
 shmget          -       shmget          i:iii   __shmget        shmget
index b2caf7543bd586826d7250773701c14163d32490..07725fedd1f97ac30800baf0ef0d8a015134fc54 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
 #include <sys/shm.h>
+#include <stdarg.h>
 #include <ipc_priv.h>
-
 #include <sysdep.h>
-#include <string.h>
-#include <sys/syscall.h>
-#include <bits/wordsize.h>
 #include <shlib-compat.h>
+#include <errno.h>
+
+
+#ifndef DEFAULT_VERSION
+# define DEFAULT_VERSION GLIBC_2_2
+#endif
 
-#include <kernel-features.h>
 
+/* Provide operations to control over shared memory segments.  */
+int
+__new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
+{
+#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+  return INLINE_SYSCALL_CALL (shmctl, shmid, cmd | __IPC_64, buf);
+#else
+  return INLINE_SYSCALL_CALL (ipc, IPCOP_shmctl, shmid, cmd | __IPC_64, 0,
+                             buf);
+#endif
+}
+versioned_symbol (libc, __new_shmctl, shmctl, DEFAULT_VERSION);
+
+
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 struct __old_shmid_ds
 {
   struct __old_ipc_perm shm_perm;      /* operation permission struct */
@@ -43,36 +59,15 @@ struct __old_shmid_ds
   struct vm_area_struct *__attaches;   /* descriptors for attaches */
 };
 
-struct __old_shminfo
-{
-  int shmmax;
-  int shmmin;
-  int shmmni;
-  int shmseg;
-  int shmall;
-};
-
-/* Provide operations to control over shared memory segments.  */
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
-int __old_shmctl (int, int, struct __old_shmid_ds *);
-#endif
-int __new_shmctl (int, int, struct shmid_ds *);
-
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
 attribute_compat_text_section
 __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf)
 {
-  return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl, shmid, cmd, 0, buf);
+#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+  return INLINE_SYSCALL_CALL (shmctl, shmid, cmd, buf);
+#else
+  return INLINE_SYSCALL_CALL (ipc, IPCOP_shmctl, shmid, cmd, 0, buf);
+#endif
 }
 compat_symbol (libc, __old_shmctl, shmctl, GLIBC_2_0);
 #endif
-
-int
-__new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
-{
-  return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl, shmid, cmd | __IPC_64, 0,
-                        buf);
-}
-
-versioned_symbol (libc, __new_shmctl, shmctl, GLIBC_2_2);
index 8712bb83ed782292b1f6add5d7b68207947f7b47..18bd588b4c7a1ef48c43f1d15d0f92e6d061473b 100644 (file)
@@ -6,7 +6,6 @@ pread64         -       pread64         Ci:ipii __libc_pread    __libc_pread64 __pread64 pread64 __prea
 preadv64       -       preadv          Ci:ipii preadv64        preadv
 pwrite64       -       pwrite64        Ci:ipii __libc_pwrite   __libc_pwrite64 __pwrite64 pwrite64 __pwrite pwrite
 pwritev64      -       pwritev         Ci:ipii pwritev64       pwritev
-shmctl         -       shmctl          i:iip   __shmctl        shmctl
 shmdt          -       shmdt           i:s     __shmdt         shmdt
 shmget         -       shmget          i:iii   __shmget        shmget
 syscall_clock_gettime  EXTRA   clock_gettime   Ei:ip           __syscall_clock_gettime