From patchwork Fri Feb 22 19:27:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 159071 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp2103936jaa; Fri, 22 Feb 2019 11:27:25 -0800 (PST) X-Google-Smtp-Source: AHgI3IYLHpt07Def5bmuAS2ht4yGuIjVF53rmtuD9NRWqYkGp6PbOq1GOIOLzwu/zLP3wOd7INou X-Received: by 2002:a62:f598:: with SMTP id b24mr5762264pfm.72.1550863645526; Fri, 22 Feb 2019 11:27:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550863645; cv=none; d=google.com; s=arc-20160816; b=HSoNDnjMHibt9dN2CUnwoL65yjllvNS9uNqpuMdwzIUfa/2dg94xdJG+fn8s+wdJ4K 09PuXduq6W4KU3ACOYUXixr5OAk2pHAgKCfhUJqaS7G1eL0njPd3KEBUdlRNoHt4OaA+ E1Rw4Np4JzgLwJmXCTVdB80ro+pDTmL8DQhe4moWT67VDIZztmm3pEjQCml2RywfGL3w 6qTc9ehdod//wSf9SfyRfecl39dDWsiqAVgpsmilhSYRZUJfRO791z0qP2R/fB50Aq1X CmkjZEOShRvfI4IqNTazRn68zjiIHVw6iXIXFZ8p4kIAGH4WWSU3yshEv9b0te1fptqf 8X+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:to:from:dkim-signature:delivered-to:sender :list-help:list-post:list-archive:list-subscribe:list-unsubscribe :list-id:precedence:mailing-list:dkim-signature:domainkey-signature; bh=40d/JWbdqKdeyYWjlS/Eogcgyc2VnVJZHqWdOEb0P2Y=; b=QyQdCkBb1jKz0MoE7pTn8VrdMMSeRq4WN9sXXZnO+WU3oHYhWP6CCr8ziAUKhbGOiR W2il7uwoss+MqAlUtq8GYrCb48/zwTFs1s+/M9voIjlZmxrLH6QPwzWvCsYQuL5gLCjw rJgkwzBmYY0y03QWaaDosrvx+vaW3pKyqGUSkFaSBD0LmIJkbCAoAL+GNz2TGdu4wOnO x2HTOUf6RLAdeQC36PU2Cq8tcw7qimMCED5c1sTGVPUY/IzY61juBB3jG8avzVYizp0g 1tbgkJZc2HIcRVfpMpgniia7QGDnk8oLz5ScqPS/VS7NR8ZwDHddkVEuOv/CopFmBMlf 8GoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Yhx3OCbD; dkim=pass header.i=@linaro.org header.s=google header.b=AANdl6vX; spf=pass (google.com: domain of libc-alpha-return-100226-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-100226-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id k14si2099226pgl.40.2019.02.22.11.27.25 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 11:27:25 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-100226-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Yhx3OCbD; dkim=pass header.i=@linaro.org header.s=google header.b=AANdl6vX; spf=pass (google.com: domain of libc-alpha-return-100226-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-100226-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id; q=dns; s= default; b=mV52oQSisHxJfadSQ6pHlDTb2sMcV3RwZXmvROe2GwaR+2DPVRgva RarkB8VyWEqS9P6kNDnMA2G0k4x7VIJNVXLcII7pLWzrwepm+W+PPd0CikcZ1zLE wdZktchIwIiTDlB1tdhveoTbqWqymkZvRP0QJqJUyAp5lh5OHhmIM4= 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:from:to:subject:date:message-id; s=default; bh=OGPKnudch+coQdro7MOO+6GfLeo=; b=Yhx3OCbDWlHIouR7wpQXlsnPjvn0 Li0t+TfCtXCKeARl9L+yCm83DHQypkv/JhT+hZQm5A43Gr3FXfJDpP7y5hk7rkIU p4MkHG8f7Fmn/iopFU4Zz57zRtIL15pWol89wZcVlTgfcWqFyyiBOYozn9Lptj1F wHCjXkeVjcZnwDA= Received: (qmail 104230 invoked by alias); 22 Feb 2019 19:27:14 -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 104059 invoked by uid 89); 22 Feb 2019 19:27:14 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=inclusion, nonexported, cancellation, Single X-HELO: mail-qt1-f196.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id; bh=40d/JWbdqKdeyYWjlS/Eogcgyc2VnVJZHqWdOEb0P2Y=; b=AANdl6vXUdrVM5k+1eZEgyUMP6aqaTVUZWZr/E55fSRbjtoohuY/drKDmEkKX8lZTB WAnAkOD2GRqPeKGTs3A7NuWNnUbTxjZGzk6CVBxeypUz6zHp7n9FOyfokalAgBi8zmHX tMlazJ6fKWtfG4bFHprqYw2JnzgawlHL/ZyRNRPexKqvgNRWtu5cYAgd8L9iaQDqyUVT 6GUNPlqCnj1NkJgeqYPuW/eoNoO8NydslXJwpZufPaK5CwU6l0kyi9k/QEm7yAQ7KL2Q KFnPaa1ZKo8dlhR8LgNyOw9SWtpvy3KWdUaRLeEUUJ1yeq9r+LJgdEP7pW79hOr6NHxA xT+w== Return-Path: From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 1/4] Add single-thread.h header Date: Fri, 22 Feb 2019 16:27:00 -0300 Message-Id: <20190222192703.18177-1-adhemerval.zanella@linaro.org> This patch move the single-thread syscall optimization defintions from syscall-cancel.h to new header file single-thread.h and also move the cancellation definitions from pthreadP.h to syscall-cancel.h. The idea is just simplify the inclusion of both syscall-cancel.h and single-thread.h (without the requirement of including all pthreadP.h defintions). No semantic changes expected, checked on a build for all major ABIs. * nptl/pthreadP.h (CANCEL_ASYNC, CANCEL_RESET, LIBC_CANCEL_ASYNC, LIBC_CANCEL_RESET, __libc_enable_asynccancel, __libc_disable_asynccancel, __librt_enable_asynccancel, __libc_disable_asynccancel, __librt_enable_asynccancel, __librt_disable_asynccancel): Move to ... * sysdeps/unix/sysv/linux/sysdep-cancel.h: ... here. (SINGLE_THREAD_P, RTLD_SINGLE_THREAD_P): Move to ... * sysdeps/unix/sysv/linux/single-thread.h: ... here. * sysdeps/generic/single-thread.h: New file. * sysdeps/unix/sysdep.h: Include single-thread.h. * sysdeps/unix/sysv/linux/futex-internal.h: Include sysdep-cancel.h. * sysdeps/unix/sysv/linux/lowlevellock-futex.h: Likewise. --- nptl/pthreadP.h | 37 --------- sysdeps/generic/single-thread.h | 24 ++++++ sysdeps/unix/sysdep.h | 2 +- sysdeps/unix/sysv/linux/futex-internal.h | 2 +- sysdeps/unix/sysv/linux/lowlevellock-futex.h | 2 +- sysdeps/unix/sysv/linux/single-thread.h | 64 ++++++++++++++++ sysdeps/unix/sysv/linux/sysdep-cancel.h | 81 ++++++++++---------- 7 files changed, 133 insertions(+), 79 deletions(-) create mode 100644 sysdeps/generic/single-thread.h create mode 100644 sysdeps/unix/sysv/linux/single-thread.h -- 2.17.1 diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 626bd4b096..0beacd1266 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -311,34 +311,6 @@ __do_cancel (void) } -/* Set cancellation mode to asynchronous. */ -#define CANCEL_ASYNC() \ - __pthread_enable_asynccancel () -/* Reset to previous cancellation mode. */ -#define CANCEL_RESET(oldtype) \ - __pthread_disable_asynccancel (oldtype) - -#if IS_IN (libc) -/* Same as CANCEL_ASYNC, but for use in libc.so. */ -# define LIBC_CANCEL_ASYNC() \ - __libc_enable_asynccancel () -/* Same as CANCEL_RESET, but for use in libc.so. */ -# define LIBC_CANCEL_RESET(oldtype) \ - __libc_disable_asynccancel (oldtype) -#elif IS_IN (libpthread) -# define LIBC_CANCEL_ASYNC() CANCEL_ASYNC () -# define LIBC_CANCEL_RESET(val) CANCEL_RESET (val) -#elif IS_IN (librt) -# define LIBC_CANCEL_ASYNC() \ - __librt_enable_asynccancel () -# define LIBC_CANCEL_RESET(val) \ - __librt_disable_asynccancel (val) -#else -# define LIBC_CANCEL_ASYNC() 0 /* Just a dummy value. */ -# define LIBC_CANCEL_RESET(val) ((void)(val)) /* Nothing, but evaluate it. */ -#endif - - /* Internal prototypes. */ /* Thread list handling. */ @@ -545,15 +517,6 @@ extern int __pthread_cond_wait_2_0 (pthread_cond_2_0_t *cond, extern int __pthread_getaffinity_np (pthread_t th, size_t cpusetsize, cpu_set_t *cpuset); -/* The two functions are in libc.so and not exported. */ -extern int __libc_enable_asynccancel (void) attribute_hidden; -extern void __libc_disable_asynccancel (int oldtype) attribute_hidden; - - -/* The two functions are in librt.so and not exported. */ -extern int __librt_enable_asynccancel (void) attribute_hidden; -extern void __librt_disable_asynccancel (int oldtype) attribute_hidden; - #if IS_IN (libpthread) /* Special versions which use non-exported functions. */ extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer, diff --git a/sysdeps/generic/single-thread.h b/sysdeps/generic/single-thread.h new file mode 100644 index 0000000000..0a1520ec49 --- /dev/null +++ b/sysdeps/generic/single-thread.h @@ -0,0 +1,24 @@ +/* Single thread optimization, generic 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 + 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 + . */ + +#ifndef _SINGLE_THREAD_H +#define _SINGLE_THREAD_H + +#define SINGLE_THREAD_P (0) + +#endif /* _SINGLE_THREAD_H */ diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h index 7cb6c89825..6e503d7688 100644 --- a/sysdeps/unix/sysdep.h +++ b/sysdeps/unix/sysdep.h @@ -16,7 +16,7 @@ . */ #include - +#include #include #define HAVE_SYSCALLS diff --git a/sysdeps/unix/sysv/linux/futex-internal.h b/sysdeps/unix/sysv/linux/futex-internal.h index 55f0fab77c..501f993853 100644 --- a/sysdeps/unix/sysv/linux/futex-internal.h +++ b/sysdeps/unix/sysv/linux/futex-internal.h @@ -22,7 +22,7 @@ #include #include #include -#include +#include /* See sysdeps/nptl/futex-internal.h for documentation; this file only contains Linux-specific comments. diff --git a/sysdeps/unix/sysv/linux/lowlevellock-futex.h b/sysdeps/unix/sysv/linux/lowlevellock-futex.h index 6f060b1739..030a14b8dc 100644 --- a/sysdeps/unix/sysv/linux/lowlevellock-futex.h +++ b/sysdeps/unix/sysv/linux/lowlevellock-futex.h @@ -21,7 +21,7 @@ #ifndef __ASSEMBLER__ #include -#include +#include #include #endif diff --git a/sysdeps/unix/sysv/linux/single-thread.h b/sysdeps/unix/sysv/linux/single-thread.h new file mode 100644 index 0000000000..8248c5d8b8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/single-thread.h @@ -0,0 +1,64 @@ +/* Single thread optimization, Linux 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 + 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 + . */ + +#ifndef _SINGLE_THREAD_H +#define _SINGLE_THREAD_H + +/* The default way to check if the process is single thread is by using the + pthread_t 'multiple_threads' field. However for some architectures it + is faster to either use an extra field on TCB or global varibles + (the TCB field is also used on x86 for some single-thread atomic + optimizations). + + The ABI might define SINGLE_THREAD_BY_GLOBAL to enable the single + thread check to use global variables instead of the pthread_t + field. */ + +#ifdef SINGLE_THREAD_BY_GLOBAL +# if IS_IN (libc) +extern int __libc_multiple_threads; +# define SINGLE_THREAD_P \ + __glibc_likely (__libc_multiple_threads == 0) +# elif IS_IN (libpthread) +extern int __pthread_multiple_threads; +# define SINGLE_THREAD_P \ + __glibc_likely (__pthread_multiple_threads == 0) +# elif IS_IN (librt) +# define SINGLE_THREAD_P \ + __glibc_likely (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0) +# else +/* For rtld, et cetera. */ +# define SINGLE_THREAD_P (1) +# endif +#else /* SINGLE_THREAD_BY_GLOBAL */ +# if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) +# define SINGLE_THREAD_P \ + __glibc_likely (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0) +# else +/* For rtld, et cetera. */ +# define SINGLE_THREAD_P (1) +# endif +#endif /* SINGLE_THREAD_BY_GLOBAL */ + +#define RTLD_SINGLE_THREAD_P \ + __glibc_likely (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0) + +#endif /* _SINGLE_THREAD_H */ diff --git a/sysdeps/unix/sysv/linux/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sysdep-cancel.h index 896549c7f7..a831b30106 100644 --- a/sysdeps/unix/sysv/linux/sysdep-cancel.h +++ b/sysdeps/unix/sysv/linux/sysdep-cancel.h @@ -17,48 +17,51 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SYSDEP_CANCEL_H +#define _SYSDEP_CANCEL_H + #include #include -#include +#include + +/* The two functions are in libc.so and not exported. */ +extern int __libc_enable_asynccancel (void) attribute_hidden; +extern void __libc_disable_asynccancel (int oldtype) attribute_hidden; + +/* The two functions are in librt.so and not exported. */ +extern int __librt_enable_asynccancel (void) attribute_hidden; +extern void __librt_disable_asynccancel (int oldtype) attribute_hidden; + +/* The two functions are in libpthread.so and not exported. */ +extern int __pthread_enable_asynccancel (void) attribute_hidden; +extern void __pthread_disable_asynccancel (int oldtype) attribute_hidden; -/* The default way to check if the process is single thread is by using the - pthread_t 'multiple_threads' field. However for some architectures it - is faster to either use an extra field on TCB or global varibles - (the TCB field is also used on x86 for some single-thread atomic - optimizations). +/* Set cancellation mode to asynchronous. */ +#define CANCEL_ASYNC() \ + __pthread_enable_asynccancel () +/* Reset to previous cancellation mode. */ +#define CANCEL_RESET(oldtype) \ + __pthread_disable_asynccancel (oldtype) - The ABI might define SINGLE_THREAD_BY_GLOBAL to enable the single - thread check to use global variables instead of the pthread_t - field. */ +#if IS_IN (libc) +/* Same as CANCEL_ASYNC, but for use in libc.so. */ +# define LIBC_CANCEL_ASYNC() \ + __libc_enable_asynccancel () +/* Same as CANCEL_RESET, but for use in libc.so. */ +# define LIBC_CANCEL_RESET(oldtype) \ + __libc_disable_asynccancel (oldtype) +#elif IS_IN (libpthread) +# define LIBC_CANCEL_ASYNC() CANCEL_ASYNC () +# define LIBC_CANCEL_RESET(val) CANCEL_RESET (val) +#elif IS_IN (librt) +# define LIBC_CANCEL_ASYNC() \ + __librt_enable_asynccancel () +# define LIBC_CANCEL_RESET(val) \ + __librt_disable_asynccancel (val) +#else +# define LIBC_CANCEL_ASYNC() 0 /* Just a dummy value. */ +# define LIBC_CANCEL_RESET(val) ((void)(val)) /* Nothing, but evaluate it. */ +#endif -#ifdef SINGLE_THREAD_BY_GLOBAL -# if IS_IN (libc) -extern int __libc_multiple_threads; -# define SINGLE_THREAD_P \ - __glibc_likely (__libc_multiple_threads == 0) -# elif IS_IN (libpthread) -extern int __pthread_multiple_threads; -# define SINGLE_THREAD_P \ - __glibc_likely (__pthread_multiple_threads == 0) -# elif IS_IN (librt) -# define SINGLE_THREAD_P \ - __glibc_likely (THREAD_GETMEM (THREAD_SELF, \ - header.multiple_threads) == 0) -# else -/* For rtld, et cetera. */ -# define SINGLE_THREAD_P (1) -# endif -#else /* SINGLE_THREAD_BY_GLOBAL */ -# if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) -# define SINGLE_THREAD_P \ - __glibc_likely (THREAD_GETMEM (THREAD_SELF, \ - header.multiple_threads) == 0) -# else -/* For rtld, et cetera. */ -# define SINGLE_THREAD_P (1) -# endif -#endif /* SINGLE_THREAD_BY_GLOBAL */ -#define RTLD_SINGLE_THREAD_P \ - __glibc_likely (THREAD_GETMEM (THREAD_SELF, \ - header.multiple_threads) == 0) +#endif