diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/elision-conf.c | 20 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/not-errno.h | 30 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/syscall.S | 1 |
5 files changed, 20 insertions, 33 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/elision-conf.c b/sysdeps/unix/sysv/linux/powerpc/elision-conf.c index 906882a..fc82bd1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/elision-conf.c +++ b/sysdeps/unix/sysv/linux/powerpc/elision-conf.c @@ -127,6 +127,26 @@ elision_init (int argc __attribute__ ((unused)), TUNABLE_CALLBACK (set_elision_skip_trylock_internal_abort)); #endif + /* Linux from 3.9 through 4.2 do not abort HTM transaction on syscalls, + instead it suspends the transaction and resumes it when returning to + usercode. The side-effects of the syscall will always remain visible, + even if the transaction is aborted. This is an issue when a transaction + is used along with futex syscall, on pthread_cond_wait for instance, + where futex might succeed but the transaction is rolled back leading + the condition variable object in an inconsistent state. + + Glibc used to prevent it by always aborting a transaction before issuing + a syscall. Linux 4.2 also decided to abort active transaction in + syscalls which makes the glibc workaround superflours. Worse, glibc + transaction abortions leads to a performance issues on recent kernels. + + So Lock Elision is just enabled when it has been explict set (either + by tunables of by a configure switch) and if kernel aborts HTM + transactions on syscalls (PPC_FEATURE2_HTM_NOSC) */ + + __pthread_force_elision = (__pthread_force_elision + && GLRO (dl_hwcap2) & PPC_FEATURE2_HTM_NOSC); + if (!__pthread_force_elision) __elision_aconf.try_tbegin = 0; /* Disable elision on rwlocks. */ } diff --git a/sysdeps/unix/sysv/linux/powerpc/not-errno.h b/sysdeps/unix/sysv/linux/powerpc/not-errno.h deleted file mode 100644 index 27da21b..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/not-errno.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Syscall wrapper that do not set errno. Linux powerpc version. - Copyright (C) 2018 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/>. */ - -/* __access_noerrno is used during process initialization in elf/dl-tunables.c - before the TCB is initialized, prohibiting the usage of - ABORT_TRANSACTION. */ -#undef ABORT_TRANSACTION -#define ABORT_TRANSACTION - -#include "sysdeps/unix/sysv/linux/not-errno.h" - -/* Recover ABORT_TRANSACTION's previous value, in order to not affect - other syscalls. */ -#undef ABORT_TRANSACTION -#define ABORT_TRANSACTION ABORT_TRANSACTION_IMPL diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h index f7277d5..ec5c525 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h @@ -109,7 +109,6 @@ register long int r11 __asm__ ("r11"); \ register long int r12 __asm__ ("r12"); \ LOADARGS_##nr(name, args); \ - ABORT_TRANSACTION; \ __asm__ __volatile__ \ ("sc \n\t" \ "mfcr %0" \ diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h index 0956cf0..1f17f7b 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h @@ -131,7 +131,6 @@ register long int r7 __asm__ ("r7"); \ register long int r8 __asm__ ("r8"); \ LOADARGS_##nr (name, ##args); \ - ABORT_TRANSACTION; \ __asm__ __volatile__ \ ("sc\n\t" \ "mfcr %0\n\t" \ diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S index 2da9172..bbab613 100644 --- a/sysdeps/unix/sysv/linux/powerpc/syscall.S +++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S @@ -18,7 +18,6 @@ #include <sysdep.h> ENTRY (syscall) - ABORT_TRANSACTION mr r0,r3 mr r3,r4 mr r4,r5 |