public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org
Subject: [PATCH v3 08/17] Consolidate Linux semctl implementation
Date: Tue, 08 Nov 2016 20:31:00 -0000	[thread overview]
Message-ID: <1478637007-31212-9-git-send-email-adhemerval.zanella@linaro.org> (raw)
In-Reply-To: <1478637007-31212-1-git-send-email-adhemerval.zanella@linaro.org>

Changes from previous version:

  - Fix alpha issues and remove old unnecessary implementations.                            
  - Change mips64 way to use default implementation (by undef SHLIB_COMPAT). 
  - Remove semctl from syscalls.list.

--

This patch consolidates the semctl Linux implementation in only
one default file, sysdeps/unix/sysv/linux/semctl.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
	oldsemctl.
	* sysdeps/unix/sysv/linux/alpha/semctl.c: Remove file.
	* sysdeps/unix/sysv/linux/arm/semctl.c: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/semctl.c: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/semctl.c: Use defaulf
	implementation.
	* sysdeps/unix/sysv/linux/semctl.c (__new_semctl): Use semctl
	syscall if it is defined.
	* sysdeps/unix/sysv/linux/generic/syscalls.list (semctl): Remove.
	* sysdeps/unix/sysv/linux/alpha/syscalls.list (semctl): Likewise.
	* sysdeps/unix/sysv/linux/hppa/syscalls.list (semctl): Likewise.
	* sysdeps/unix/sysv/linux/ia64/syscalls.list (semctl): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (semctl):
	Likewise.
	* sysdeps/unix/sysv/linux/x86_64/syscalls.list (semctl): Likewise.
---
 ChangeLog                                          | 18 +++++++
 sysdeps/unix/sysv/linux/alpha/Makefile             |  2 +-
 sysdeps/unix/sysv/linux/alpha/semctl.c             |  1 -
 sysdeps/unix/sysv/linux/alpha/syscalls.list        |  1 -
 sysdeps/unix/sysv/linux/arm/semctl.c               | 54 --------------------
 sysdeps/unix/sysv/linux/generic/syscalls.list      |  1 -
 sysdeps/unix/sysv/linux/hppa/syscalls.list         |  1 -
 sysdeps/unix/sysv/linux/ia64/syscalls.list         |  1 -
 sysdeps/unix/sysv/linux/microblaze/semctl.c        |  1 -
 sysdeps/unix/sysv/linux/mips/mips64/semctl.c       | 38 ++------------
 sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list |  1 -
 sysdeps/unix/sysv/linux/semctl.c                   | 58 +++++++++++-----------
 sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c     | 54 --------------------
 sysdeps/unix/sysv/linux/x86_64/syscalls.list       |  1 -
 14 files changed, 54 insertions(+), 178 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/alpha/semctl.c
 delete mode 100644 sysdeps/unix/sysv/linux/arm/semctl.c
 delete mode 100644 sysdeps/unix/sysv/linux/microblaze/semctl.c
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c

diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
index c24dc2e..386b3fd 100644
--- a/sysdeps/unix/sysv/linux/alpha/Makefile
+++ b/sysdeps/unix/sysv/linux/alpha/Makefile
@@ -18,7 +18,7 @@ sysdep_routines += osf_select osf_gettimeofday osf_settimeofday \
 		   osf_getrusage osf_wait4
 
 # Support old ipc control
-sysdep_routines += oldsemctl oldshmctl
+sysdep_routines += oldshmctl
 
 CFLAGS-ioperm.c = -Wa,-mev6
 endif
diff --git a/sysdeps/unix/sysv/linux/alpha/semctl.c b/sysdeps/unix/sysv/linux/alpha/semctl.c
deleted file mode 100644
index 4cb834a..0000000
--- a/sysdeps/unix/sysv/linux/alpha/semctl.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/arm/semctl.c>
diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list
index 54c1752..c12620a 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscalls.list
+++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list
@@ -7,7 +7,6 @@ shmget		-	shmget		i:iii	__shmget	shmget
 semop		-	semop		i:ipi	__semop		semop
 semtimedop	-	semtimedop	i:ipip	semtimedop
 semget		-	semget		i:iii	__semget	semget
-oldsemctl	EXTRA	semctl		i:iiii	__old_semctl	semctl@GLIBC_2.0
 
 sigstack	-	sigstack	2	sigstack
 
diff --git a/sysdeps/unix/sysv/linux/arm/semctl.c b/sysdeps/unix/sysv/linux/arm/semctl.c
deleted file mode 100644
index 79d9d3e..0000000
--- a/sysdeps/unix/sysv/linux/arm/semctl.c
+++ /dev/null
@@ -1,54 +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 <stdarg.h>
-#include <sys/sem.h>
-#include <ipc_priv.h>
-#include <sysdep.h>
-#include <sys/syscall.h>
-
-
-/* Define a `union semun' suitable for Linux here.  */
-union semun
-{
-  int val;			/* value for SETVAL */
-  struct semid_ds *buf;		/* buffer for IPC_STAT & IPC_SET */
-  unsigned short int *array;	/* array for GETALL & SETALL */
-  struct seminfo *__buf;	/* buffer for IPC_INFO */
-};
-
-int
-__new_semctl (int semid, int semnum, int cmd, ...)
-{
-  union semun arg;
-  va_list ap;
-
-  va_start (ap, cmd);
-
-  /* Get the argument.  */
-  arg = va_arg (ap, union semun);
-
-  va_end (ap);
-
-  return INLINE_SYSCALL (semctl, 4, semid, semnum, cmd | __IPC_64,
-			 arg.array);
-}
-
-#include <shlib-compat.h>
-versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/generic/syscalls.list b/sysdeps/unix/sysv/linux/generic/syscalls.list
index ad75223..f95f1f7 100644
--- a/sysdeps/unix/sysv/linux/generic/syscalls.list
+++ b/sysdeps/unix/sysv/linux/generic/syscalls.list
@@ -2,7 +2,6 @@
 
 # SysV APIs
 semget		-	semget		i:iii	__semget	semget
-semctl		-	semctl		i:iiii	__semctl	semctl
 semtimedop	-	semtimedop	i:ipip	semtimedop
 semop		-	semop		i:ipi	__semop		semop
 shmget		-	shmget		i:iii	__shmget	shmget
diff --git a/sysdeps/unix/sysv/linux/hppa/syscalls.list b/sysdeps/unix/sysv/linux/hppa/syscalls.list
index da2c9ab..5040ef3 100644
--- a/sysdeps/unix/sysv/linux/hppa/syscalls.list
+++ b/sysdeps/unix/sysv/linux/hppa/syscalls.list
@@ -8,7 +8,6 @@ shmget		-	shmget		i:iii	__shmget	shmget
 semop		-	semop		i:ipi	__semop		semop
 semtimedop      -       semtimedop      i:ipip  semtimedop
 semget		-	semget		i:iii	__semget	semget
-semctl		-	semctl		i:iiii	__semctl	semctl
 
 # proper socket implementations:
 accept		-	accept		Ci:iBN	__libc_accept	__accept accept
diff --git a/sysdeps/unix/sysv/linux/ia64/syscalls.list b/sysdeps/unix/sysv/linux/ia64/syscalls.list
index 8056781..ca5cba4 100644
--- a/sysdeps/unix/sysv/linux/ia64/syscalls.list
+++ b/sysdeps/unix/sysv/linux/ia64/syscalls.list
@@ -12,7 +12,6 @@ shmget		-	shmget		i:iii	__shmget	shmget
 semop		-	semop		i:ipi	__semop		semop
 semtimedop	-	semtimedop	i:ipip	semtimedop
 semget		-	semget		i:iii	__semget	semget
-semctl		-	semctl		i:iiii	__semctl	semctl
 
 # proper socket implementations:
 accept		-	accept		Ci:iBN	__libc_accept	__accept accept
diff --git a/sysdeps/unix/sysv/linux/microblaze/semctl.c b/sysdeps/unix/sysv/linux/microblaze/semctl.c
deleted file mode 100644
index 4cb834a..0000000
--- a/sysdeps/unix/sysv/linux/microblaze/semctl.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/arm/semctl.c>
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/semctl.c b/sysdeps/unix/sysv/linux/mips/mips64/semctl.c
index 1115a25..5a0c2a3 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/semctl.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/semctl.c
@@ -15,39 +15,11 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <stdarg.h>
-#include <sys/sem.h>
-#include <ipc_priv.h>
-#include <sysdep.h>
-
-/* Define a `union semun' suitable for Linux here.  */
-union semun
-{
-  int val;			/* value for SETVAL */
-  struct semid_ds *buf;		/* buffer for IPC_STAT & IPC_SET */
-  unsigned short int *array;	/* array for GETALL & SETALL */
-  struct seminfo *__buf;	/* buffer for IPC_INFO */
-};
-
-int __semctl (int semid, int semnum, int cmd, ...);
-
-int
-__semctl (int semid, int semnum, int cmd, ...)
-{
-  union semun arg;
-  va_list ap;
-
-  va_start (ap, cmd);
-
-  /* Get the argument.  */
-  arg = va_arg (ap, union semun);
+#include <shlib-compat.h>
 
-  va_end (ap);
+#undef SHLIB_COMPAT
+#define SHLIB_COMPAT(a, b, c) 0
 
-  return INLINE_SYSCALL (semctl, 4, semid, semnum, cmd | __IPC_64,
-			 arg.array);
-}
+#define DEFAULT_VERSION GLIBC_2_0
 
-#include <shlib-compat.h>
-versioned_symbol (libc, __semctl, semctl, GLIBC_2_0);
+#include <sysdeps/unix/sysv/linux/semctl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list b/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
index f23b379..09ab580 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
@@ -7,4 +7,3 @@ shmdt		-	shmdt		i:s	__shmdt		shmdt
 shmget		-	shmget		i:iii	__shmget	shmget
 semop		-	semop		i:ipi	__semop		semop
 semget		-	semget		i:iii	__semget	semget
-semctl		-	semctl		i:iiii	__semctl	semctl
diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c
index ee84a1e..a2b9f0d 100644
--- a/sysdeps/unix/sysv/linux/semctl.c
+++ b/sysdeps/unix/sysv/linux/semctl.c
@@ -16,18 +16,14 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <stdarg.h>
 #include <sys/sem.h>
+#include <stdarg.h>
 #include <ipc_priv.h>
-
 #include <sysdep.h>
-#include <string.h>
-#include <sys/syscall.h>
 #include <shlib-compat.h>
+#include <errno.h>
 
-#include <kernel-features.h>
-
+/* Old semid_ds definition.  */
 struct __old_semid_ds
 {
   struct __old_ipc_perm sem_perm;	/* operation permission struct */
@@ -50,23 +46,17 @@ union semun
   struct __old_semid_ds *__old_buf;
 };
 
-/* Return identifier for array of NSEMS semaphores associated with
-   KEY.  */
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
-int __old_semctl (int semid, int semnum, int cmd, ...);
+#ifndef DEFAULT_VERSION
+# define DEFAULT_VERSION GLIBC_2_2
 #endif
-int __new_semctl (int semid, int semnum, int cmd, ...);
 
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
-attribute_compat_text_section
-__old_semctl (int semid, int semnum, int cmd, ...)
+__new_semctl (int semid, int semnum, int cmd, ...)
 {
-  union semun arg;
+  union semun arg = { 0 };
   va_list ap;
 
   /* Get the argument only if required.  */
-  arg.buf = NULL;
   switch (cmd)
     {
     case SETVAL:        /* arg.val */
@@ -83,20 +73,28 @@ __old_semctl (int semid, int semnum, int cmd, ...)
       break;
     }
 
-  return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
-			 &arg);
-}
-compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
+#ifdef __ASSUME_SYSVIPC_SYSCALL
+  return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd | __IPC_64,
+			      arg.array);
+#else
+  return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
+			      SEMCTL_ARG_ADDRESS (arg));
 #endif
+}
+versioned_symbol (libc, __new_semctl, semctl, DEFAULT_VERSION);
+
+
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
+int __old_semctl (int semid, int semnum, int cmd, ...);
 
 int
-__new_semctl (int semid, int semnum, int cmd, ...)
+attribute_compat_text_section
+__old_semctl (int semid, int semnum, int cmd, ...)
 {
-  union semun arg;
+  union semun arg = { 0 };
   va_list ap;
 
   /* Get the argument only if required.  */
-  arg.buf = NULL;
   switch (cmd)
     {
     case SETVAL:        /* arg.val */
@@ -113,8 +111,12 @@ __new_semctl (int semid, int semnum, int cmd, ...)
       break;
     }
 
-  return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
-			 &arg);
+# ifdef __ASSUME_SYSVIPC_SYSCALL
+  return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd, arg.array);
+# else
+  return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd,
+			      SEMCTL_ARG_ADDRESS (arg));
+# endif
 }
-
-versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
+compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c b/sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c
deleted file mode 100644
index a9ae4c6..0000000
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c
+++ /dev/null
@@ -1,54 +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 <stdarg.h>
-#include <sys/sem.h>
-#include <ipc_priv.h>
-
-#include <sysdep.h>
-#include <sys/syscall.h>
-
-/* Define a `union semun' suitable for Linux here.  */
-union semun
-{
-  int val;			/* value for SETVAL */
-  struct semid_ds *buf;		/* buffer for IPC_STAT & IPC_SET */
-  unsigned short int *array;	/* array for GETALL & SETALL */
-  struct seminfo *__buf;	/* buffer for IPC_INFO */
-};
-
-/* Return identifier for array of NSEMS semaphores associated with
-   KEY.  */
-
-int
-semctl (int semid, int semnum, int cmd, ...)
-{
-  union semun arg;
-  va_list ap;
-
-  va_start (ap, cmd);
-
-  /* Get the argument.  */
-  arg = va_arg (ap, union semun);
-
-  va_end (ap);
-
-  return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
-			 arg.array);
-}
diff --git a/sysdeps/unix/sysv/linux/x86_64/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/syscalls.list
index 53ead93..96ddfcb 100644
--- a/sysdeps/unix/sysv/linux/x86_64/syscalls.list
+++ b/sysdeps/unix/sysv/linux/x86_64/syscalls.list
@@ -9,7 +9,6 @@ shmget		-	shmget		i:iii	__shmget	shmget
 semop		-	semop		i:ipi	__semop		semop
 semtimedop	-	semtimedop	i:ipip	semtimedop
 semget		-	semget		i:iii	__semget	semget
-semctl		-	semctl		i:iiii	__semctl	semctl
 syscall_clock_gettime	EXTRA	clock_gettime	Ei:ip		__syscall_clock_gettime
 
 
-- 
2.7.4

  parent reply	other threads:[~2016-11-08 20:30 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-08 20:30 [PATCH v3 00/17] Consolidate Linux sysvipc implementation Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 01/17] Add __ASSUME_SYSVIPC_SYSCALL for Linux Adhemerval Zanella
2016-11-08 21:19   ` Andreas Schwab
2016-11-09 13:23     ` Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 03/17] Consolidate Linux msgctl implementation Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 04/17] Consolidate Linux msgrcv implementation Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 12/17] Add SYSV semaphore test Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 11/17] Consolidate Linux semtimedop implementation Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 15/17] Use shmdt syscall for linux implementation Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 13/17] Use shmat syscall for Linux implementation Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 02/17] Refactor Linux ipc_priv header Adhemerval Zanella
2016-11-08 20:30 ` [PATCH v3 10/17] Use semop syscall for Linux implementation Adhemerval Zanella
2016-11-08 20:31 ` [PATCH v3 14/17] Consolidate Linux shmctl implementation Adhemerval Zanella
2016-11-08 20:31 ` [PATCH v3 05/17] Use msgsnd syscall for Linux implementation Adhemerval Zanella
2016-11-08 21:13   ` Andreas Schwab
2016-11-09 13:23     ` Adhemerval Zanella
2016-11-08 20:31 ` [PATCH v3 09/17] Use semget " Adhemerval Zanella
2016-11-08 20:31 ` [PATCH v3 06/17] Use msgget " Adhemerval Zanella
2016-11-08 20:31 ` [PATCH v3 07/17] Add SYSV message queue test Adhemerval Zanella
2016-11-08 21:23   ` Andreas Schwab
2016-11-09 13:28     ` Adhemerval Zanella
2016-11-08 20:31 ` Adhemerval Zanella [this message]
2016-11-08 20:31 ` [PATCH v3 16/17] Use shmget syscall for linux implementation Adhemerval Zanella
2016-11-08 20:31 ` [PATCH v3 17/17] Add SYSV shared memory test Adhemerval Zanella
2016-11-09 13:57 ` [PATCH v3 00/17] Consolidate Linux sysvipc implementation Yury Norov
2016-11-25 14:02 ` Adhemerval Zanella
2016-12-07 19:14   ` Adhemerval Zanella
2016-12-09 18:31     ` Steve Ellcey
2016-12-09 20:04       ` Arnd Bergmann
2017-01-05 20:57         ` Yury Norov
2016-12-09 20:18       ` Adhemerval Zanella

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1478637007-31212-9-git-send-email-adhemerval.zanella@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).