From patchwork Fri Dec 16 14:08:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 706454 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tgBxc6YvLz9tB1 for ; Sat, 17 Dec 2016 01:08:52 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="XVRIJpmu"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:to:references:from:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; q=dns; s=default; b=dU0DffujzP0k7EHs DSZ7euxcySyUTFmVO6RvAxH8oW8kd95TlnasHMLie1HEQxL/hPb9ltg2fhaX10C8 dvw9fOm8ClwcKXrRJhuDcnE5ztKtNjANVOXxyl17EhRQkCvPhgiIZCChoJlB/R9U Fg+2aXIGQuYjSb46Hd7wZtBQe7k= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:to:references:from:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; s=default; bh=SBAJ14ZNJ3a8XO8GmEbTJy tmlmQ=; b=XVRIJpmuzC4q+njw6GDwIBOJkwx5ji8pbapqaDR3YpvuN59903VqXD y1DIUx7RCL50O0BPToPacM8tAvjgTbZwSyLBF/2/ByxXxXJB0Hv4LIzMpWWsEhJf +cA72Fjhjf6zC258+uaR+jTJGD8acM0tfhNND/LK7Zhwz9L0YA4xA= Received: (qmail 124994 invoked by alias); 16 Dec 2016 14:08:46 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 124971 invoked by uid 89); 16 Dec 2016 14:08:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.0 required=5.0 tests=BAYES_40, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=1511, ipc, 1, 54, shlib_compat X-HELO: mail-yb0-f178.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=Pmuq/EhIEBxTsq4Xs7OtpePmjk6Pq/FDlIyS5Vsomps=; b=aEuBRo2qfNXzrJhl5QFlMbFY9SNmkbXVvamXwjjb74K9ZMjXmIaKcCcKES3KmzMBI4 E4bwWPXKcNzdQ5/hl1X3OtwqJfSJO8r6PP0os8H02IULeQrAa/kyIj8jg4rUFo2uGBCA Cj4HJZv9jAjG/ngMZxuEHPuwEh9sRz2qXICGOLgFBB6pZqASDkku5He3fCMnJubi+ZWE bMjkrFmywkc3AfyACdjXwb9aTWDIgWV1aVEQgUacTdAPIcf2x00YXo1KwU8B0bILifrL yFuWSBvazw+8Hstuwe083QRV7EWjRCEKhO3oFf4TZkYEvjNnsh3ejd0rSqnaKMz6q964 AiYQ== X-Gm-Message-State: AIkVDXKUn7RlMg1ICqOULP1aUuvKU2ge3KET1bOkWYqXLbx7li5hTLZIAWaxb3TZpW9dB61i X-Received: by 10.37.161.197 with SMTP id a63mr2325961ybi.163.1481897312723; Fri, 16 Dec 2016 06:08:32 -0800 (PST) Subject: Re: [PATCH 08/17] Consolidate Linux semctl implementation To: libc-alpha@sourceware.org References: <1481545990-7247-1-git-send-email-adhemerval.zanella@linaro.org> <1481545990-7247-9-git-send-email-adhemerval.zanella@linaro.org> From: Adhemerval Zanella Message-ID: <03dc11ce-bd48-34a5-ad0e-40e9d0bd5109@linaro.org> Date: Fri, 16 Dec 2016 12:08:30 -0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: <1481545990-7247-9-git-send-email-adhemerval.zanella@linaro.org> On 12/12/2016 10:33, Adhemerval Zanella wrote: > 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. This is an updated patch based on previous ipc_priv.h header one discussion. Basically I removed the old compatibility structure definition because they are not really required: --- 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 | 71 +++++++++------------- sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c | 54 ---------------- sysdeps/unix/sysv/linux/x86_64/syscalls.list | 1 - 14 files changed, 54 insertions(+), 191 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 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 , 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 - . */ - -#include -#include -#include -#include -#include -#include - - -/* 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 -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 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 . */ -#include -#include -#include -#include -#include - -/* 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 - 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 -versioned_symbol (libc, __semctl, semctl, GLIBC_2_0); +#include 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..dde2241 100644 --- a/sysdeps/unix/sysv/linux/semctl.c +++ b/sysdeps/unix/sysv/linux/semctl.c @@ -16,29 +16,12 @@ License along with the GNU C Library; if not, see . */ -#include -#include #include +#include #include - #include -#include -#include #include - -#include - -struct __old_semid_ds -{ - struct __old_ipc_perm sem_perm; /* operation permission struct */ - __time_t sem_otime; /* last semop() time */ - __time_t sem_ctime; /* last time changed by semctl() */ - struct sem *__sembase; /* ptr to first semaphore in array */ - struct sem_queue *__sem_pending; /* pending operations */ - struct sem_queue *__sem_pending_last; /* last pending operation */ - struct sem_undo *__undo; /* ondo requests on this array */ - unsigned short int sem_nsems; /* number of semaphores in set */ -}; +#include /* Define a `union semun' suitable for Linux here. */ union semun @@ -47,26 +30,19 @@ union semun 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 */ - 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 +59,29 @@ __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_DIRECT_SYSVIPC_SYSCALLS + 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) +/* Since semctl use a variadic argument for semid_ds there is not need to + define and tie the compatibility symbol to the old 'union semun' + definition. */ 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 +98,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_DIRECT_SYSVIPC_SYSCALLS + 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 , 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 - . */ - -#include -#include -#include -#include - -#include -#include - -/* 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 75b25a1..f3a1541 100644 --- a/sysdeps/unix/sysv/linux/x86_64/syscalls.list +++ b/sysdeps/unix/sysv/linux/x86_64/syscalls.list @@ -13,7 +13,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