diff options
| author | Roland McGrath <roland@hack.frob.com> | 2014-06-26 09:31:11 -0700 |
|---|---|---|
| committer | Roland McGrath <roland@hack.frob.com> | 2014-06-26 09:31:11 -0700 |
| commit | 52ae23b4bfa09fa1f42e3f659aaa057d1176d06b (patch) | |
| tree | 7c61e56d7fbbb3c9f82994b5d3d778cc19ee48c2 /nptl/sysdeps | |
| parent | 39507e4a6c52d67780d194dae8cfb636e2dbb87e (diff) | |
| download | glibc-52ae23b4bfa09fa1f42e3f659aaa057d1176d06b.tar.xz glibc-52ae23b4bfa09fa1f42e3f659aaa057d1176d06b.zip | |
Move remaining S390 code out of nptl/.
Diffstat (limited to 'nptl/sysdeps')
25 files changed, 0 insertions, 1444 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/s390/Makefile b/nptl/sysdeps/unix/sysv/linux/s390/Makefile deleted file mode 100644 index 269832f999..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -ifeq ($(enable-lock-elision),yes) -libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \ - elision-trylock - -elision-CFLAGS = -mhtm -CFLAGS-elision-lock.c = $(elision-CFLAGS) -CFLAGS-elision-timed.c = $(elision-CFLAGS) -CFLAGS-elision-trylock.c = $(elision-CFLAGS) -CFLAGS-elision-unlock.c = $(elision-CFLAGS) -endif diff --git a/nptl/sysdeps/unix/sysv/linux/s390/Versions b/nptl/sysdeps/unix/sysv/linux/s390/Versions deleted file mode 100644 index 58632f467a..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/Versions +++ /dev/null @@ -1,5 +0,0 @@ -libpthread { - GLIBC_2.19 { - longjmp; siglongjmp; - } -} diff --git a/nptl/sysdeps/unix/sysv/linux/s390/elision-conf.c b/nptl/sysdeps/unix/sysv/linux/s390/elision-conf.c deleted file mode 100644 index 69c04836ed..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/elision-conf.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Lock elision tunable parameters. - Copyright (C) 2014 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 - <http://www.gnu.org/licenses/>. */ - -#include <config.h> -#include <pthreadP.h> -#include <elision-conf.h> -#include <unistd.h> -#include <dl-procinfo.h> - -/* Reasonable initial tuning values, may be revised in the future. - This is a conservative initial value. */ - -struct elision_config __elision_aconf = - { - /* How often to not attempt to use elision if a transaction aborted - because the lock is already acquired. Expressed in number of lock - acquisition attempts. */ - .skip_lock_busy = 3, - /* How often to not attempt to use elision if a transaction aborted due - to reasons other than other threads' memory accesses. Expressed in - number of lock acquisition attempts. */ - .skip_lock_internal_abort = 3, - /* How often to not attempt to use elision if a lock used up all retries - without success. Expressed in number of lock acquisition attempts. */ - .skip_lock_out_of_tbegin_retries = 3, - /* How often we try using elision if there is chance for the transaction - to finish execution (e.g., it wasn't aborted due to the lock being - already acquired. */ - .try_tbegin = 3, - /* Same as SKIP_LOCK_INTERNAL_ABORT but for trylock. */ - .skip_trylock_internal_abort = 3, - }; - -/* Force elision for all new locks. This is used to decide whether existing - DEFAULT locks should be automatically upgraded to elision in - pthread_mutex_lock(). Disabled for suid programs. Only used when elision - is available. */ - -int __pthread_force_elision attribute_hidden = 0; - -/* Initialize elison. */ - -static void -elision_init (int argc __attribute__ ((unused)), - char **argv __attribute__ ((unused)), - char **environ) -{ - /* Set when the CPU and the kernel supports transactional execution. - When false elision is never attempted. */ - int elision_available = (GLRO (dl_hwcap) & HWCAP_S390_TE) ? 1 : 0; - - __pthread_force_elision = __libc_enable_secure ? 0 : elision_available; -} - -#ifdef SHARED -# define INIT_SECTION ".init_array" -# define MAYBE_CONST -#else -# define INIT_SECTION ".preinit_array" -# define MAYBE_CONST const -#endif - -void (*MAYBE_CONST __pthread_init_array []) (int, char **, char **) - __attribute__ ((section (INIT_SECTION), aligned (sizeof (void *)))) = -{ - &elision_init -}; diff --git a/nptl/sysdeps/unix/sysv/linux/s390/elision-conf.h b/nptl/sysdeps/unix/sysv/linux/s390/elision-conf.h deleted file mode 100644 index d9e97947a0..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/elision-conf.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Lock elision tunable parameters. - Copyright (C) 2014 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 - <http://www.gnu.org/licenses/>. */ -#ifdef ENABLE_LOCK_ELISION -#ifndef _ELISION_CONF_H -#define _ELISION_CONF_H 1 - -#include <pthread.h> -#include <time.h> - -/* Should make sure there is no false sharing on this. */ - -struct elision_config -{ - int skip_lock_busy; - int skip_lock_internal_abort; - int skip_lock_out_of_tbegin_retries; - int try_tbegin; - int skip_trylock_internal_abort; -}; - -extern struct elision_config __elision_aconf attribute_hidden; - -extern int __pthread_force_elision attribute_hidden; - -/* Tell the test suite to test elision for this architecture. */ -#define HAVE_ELISION 1 - -#endif -#endif diff --git a/nptl/sysdeps/unix/sysv/linux/s390/elision-lock.c b/nptl/sysdeps/unix/sysv/linux/s390/elision-lock.c deleted file mode 100644 index ba5338fbb9..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/elision-lock.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Elided pthread mutex lock. - Copyright (C) 2014 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 - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <pthreadP.h> -#include <lowlevellock.h> -#include <htmintrin.h> -#include <elision-conf.h> -#include <stdint.h> - -#if !defined(LLL_LOCK) && !defined(EXTRAARG) -/* Make sure the configuration code is always linked in for static - libraries. */ -#include "elision-conf.c" -#endif - -#ifndef EXTRAARG -#define EXTRAARG -#endif -#ifndef LLL_LOCK -#define LLL_LOCK(a,b) lll_lock(a,b), 0 -#endif - -#define aconf __elision_aconf - -/* Adaptive lock using transactions. - By default the lock region is run as a transaction, and when it - aborts or the lock is busy the lock adapts itself. */ - -int -__lll_lock_elision (int *futex, short *adapt_count, EXTRAARG int private) -{ - if (*adapt_count > 0) - { - /* Lost updates are possible, but harmless. Due to races this might lead - to *adapt_count becoming less than zero. */ - (*adapt_count)--; - goto use_lock; - } - - __asm__ volatile (".machinemode \"zarch_nohighgprs\"\n\t" - ".machine \"all\"" - : : : "memory"); - - int try_tbegin; - for (try_tbegin = aconf.try_tbegin; - try_tbegin > 0; - try_tbegin--) - { - unsigned status; - if (__builtin_expect - ((status = __builtin_tbegin((void *)0)) == _HTM_TBEGIN_STARTED, 1)) - { - if (*futex == 0) - return 0; - /* Lock was busy. Fall back to normal locking. */ - if (__builtin_expect (__builtin_tx_nesting_depth (), 1)) - { - /* In a non-nested transaction there is no need to abort, - which is expensive. */ - __builtin_tend (); - if (aconf.skip_lock_busy > 0) - *adapt_count = aconf.skip_lock_busy; - goto use_lock; - } - else /* nesting depth is > 1 */ - { - /* A nested transaction will abort eventually because it - cannot make any progress before *futex changes back to 0. - So we may as well abort immediately. - This persistently aborts the outer transaction to force - the outer mutex use the default lock instead of retrying - with transactions until the try_tbegin of the outer mutex - is zero. - The adapt_count of this inner mutex is not changed, - because using the default lock with the inner mutex - would abort the outer transaction. - */ - __builtin_tabort (_HTM_FIRST_USER_ABORT_CODE | 1); - } - } - else - { - if (status != _HTM_TBEGIN_TRANSIENT) - { - /* A persistent abort (cc 1 or 3) indicates that a retry is - probably futile. Use the normal locking now and for the - next couple of calls. - Be careful to avoid writing to the lock. */ - if (aconf.skip_lock_internal_abort > 0) - *adapt_count = aconf.skip_lock_internal_abort; - goto use_lock; - } - } - } - - /* Same logic as above, but for for a number of temporary failures in a - row. */ - if (aconf.skip_lock_out_of_tbegin_retries > 0 && aconf.try_tbegin > 0) - *adapt_count = aconf.skip_lock_out_of_tbegin_retries; - - use_lock: - return LLL_LOCK ((*futex), private); -} diff --git a/nptl/sysdeps/unix/sysv/linux/s390/elision-timed.c b/nptl/sysdeps/unix/sysv/linux/s390/elision-timed.c deleted file mode 100644 index a8d8b2a348..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/elision-timed.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Lock elision timed lock. - Copyright (C) 2014 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 - <http://www.gnu.org/licenses/>. */ - -#include <time.h> -#include <elision-conf.h> -#include <lowlevellock.h> -#define __lll_lock_elision __lll_timedlock_elision -#define EXTRAARG const struct timespec *t, -#undef LLL_LOCK -#define LLL_LOCK(a, b) lll_timedlock(a, t, b) -#include "elision-lock.c" diff --git a/nptl/sysdeps/unix/sysv/linux/s390/elision-trylock.c b/nptl/sysdeps/unix/sysv/linux/s390/elision-trylock.c deleted file mode 100644 index 61447d6bf4..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/elision-trylock.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Elided pthread mutex trylock. - Copyright (C) 2014 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 - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <pthreadP.h> -#include <lowlevellock.h> -#include <htmintrin.h> -#include <elision-conf.h> - -#define aconf __elision_aconf - -/* Try to elide a futex trylock. FUTEX is the futex variable. ADAPT_COUNT is - the adaptation counter in the mutex. */ - -int -__lll_trylock_elision (int *futex, short *adapt_count) -{ - __asm__ volatile (".machinemode \"zarch_nohighgprs\"\n\t" - ".machine \"all\"" - : : : "memory"); - - /* Implement POSIX semantics by forbiding nesting elided trylocks. - Sorry. After the abort the code is re-executed - non transactional and if the lock was already locked - return an error. */ - if (__builtin_tx_nesting_depth () > 0) - { - /* Note that this abort may terminate an outermost transaction that - was created outside glibc. - This persistently aborts the current transactions to force - them to use the default lock instead of retrying transactions - until their try_tbegin is zero. - */ - __builtin_tabort (_HTM_FIRST_USER_ABORT_CODE | 1); - } - - /* Only try a transaction if it's worth it. */ - if (*adapt_count <= 0) - { - unsigned status; - - if (__builtin_expect - ((status = __builtin_tbegin ((void *)0)) == _HTM_TBEGIN_STARTED, 1)) - { - if (*futex == 0) - return 0; - /* Lock was busy. Fall back to normal locking. */ - /* Since we are in a non-nested transaction there is no need to abort, - which is expensive. */ - __builtin_tend (); - /* Note: Changing the adapt_count here might abort a transaction on a - different cpu, but that could happen anyway when the futex is - acquired, so there's no need to check the nesting depth here. */ - if (aconf.skip_lock_busy > 0) - *adapt_count = aconf.skip_lock_busy; - } - else - { - if (status != _HTM_TBEGIN_TRANSIENT) - { - /* A persistent abort (cc 1 or 3) indicates that a retry is - probably futile. Use the normal locking now and for the - next couple of calls. - Be careful to avoid writing to the lock. */ - if (aconf.skip_trylock_internal_abort > 0) - *adapt_count = aconf.skip_trylock_internal_abort; - } - } - /* Could do some retries here. */ - } - else - { - /* Lost updates are possible, but harmless. Due to races this might lead - to *adapt_count becoming less than zero. */ - (*adapt_count)--; - } - - return lll_trylock (*futex); -} diff --git a/nptl/sysdeps/unix/sysv/linux/s390/elision-unlock.c b/nptl/sysdeps/unix/sysv/linux/s390/elision-unlock.c deleted file mode 100644 index 9ceae3ee1e..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/s390/elision-unlock.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Commit an elided pthread lock. - Copyright (C) 2014 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 - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> -#include <lowlevellock.h> - -int -__lll_unlock_elision(int *futex, int private) -{ - /* If the lock is free, we elided the lock earlier. This does not - necessarily mean that we are in a transaction, because the user code may - have closed the transaction, but that is impossible to detect reliably. */ - if (*futex == 0) - { - __asm__ volatile (".machinemode \"zarch_nohighgprs\"\n\t" - ".machine \"all\"" - : : : "memory"); - __builtin_tend(); - } - else - lll_unlock ((*futex), private); - return 0; -} |
