mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-12 06:10:10 +00:00
e921c89e01
Some SPE opcodes clashes with some recent PowerISA opcodes and until recently gas did not complain about it. However binutils recently changed it and now VLE configured gas does not support to assembler some instruction that might class with VLE (HTM for instance). It also does not help that glibc build hardware lock elision support as default (regardless of assembler support). Although runtime will not actually enables TLE on SPE hardware (since kernel will not advertise it), I see little advantage on adding HTM support on SPE built glibc. SPE uses an incompatible ABI which does not allow share the same build with default powerpc and HTM code slows down SPE without any benefict. This patch fixes it by only building HTM when SPE configuration is not used. Checked with a powerpc-linux-gnuspe build. I also did some sniff tests on a e500 hardware without any issue. [BZ #22926] * sysdeps/powerpc/powerpc32/sysdep.h (ABORT_TRANSACTION_IMPL): Define empty for __SPE__. * sysdeps/powerpc/sysdep.h (ABORT_TRANSACTION): Likewise. * sysdeps/unix/sysv/linux/powerpc/elision-lock.c (__lll_lock_elision): Do not build hardware transactional code for __SPE__. * sysdeps/unix/sysv/linux/powerpc/elision-trylock.c (__lll_trylock_elision): Likewise. * sysdeps/unix/sysv/linux/powerpc/elision-unlock.c (__lll_unlock_elision): Likewise.
72 lines
2.1 KiB
C
72 lines
2.1 KiB
C
/* elision-trylock.c: Lock eliding trylock for pthreads.
|
|
Copyright (C) 2015-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/>. */
|
|
|
|
#include <pthread.h>
|
|
#include <pthreadP.h>
|
|
#include <lowlevellock.h>
|
|
#include <elision-conf.h>
|
|
#include "htm.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)
|
|
{
|
|
#ifndef __SPE__
|
|
/* Implement POSIX semantics by forbiding nesting elided trylocks. */
|
|
__libc_tabort (_ABORT_NESTED_TRYLOCK);
|
|
|
|
/* Only try a transaction if it's worth it. */
|
|
if (atomic_load_relaxed (adapt_count) > 0)
|
|
{
|
|
goto use_lock;
|
|
}
|
|
|
|
if (__libc_tbegin (0))
|
|
{
|
|
if (*futex == 0)
|
|
return 0;
|
|
|
|
/* Lock was busy. This is never a nested transaction.
|
|
End it, and set the adapt count. */
|
|
__libc_tend (0);
|
|
|
|
if (aconf.skip_lock_busy > 0)
|
|
atomic_store_relaxed (adapt_count, aconf.skip_lock_busy);
|
|
}
|
|
else
|
|
{
|
|
if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
|
|
{
|
|
/* A persistent failure indicates that a retry will probably
|
|
result in another failure. Use normal locking now and
|
|
for the next couple of calls. */
|
|
if (aconf.skip_trylock_internal_abort > 0)
|
|
atomic_store_relaxed (adapt_count,
|
|
aconf.skip_trylock_internal_abort);
|
|
}
|
|
}
|
|
|
|
use_lock:
|
|
#endif
|
|
return lll_trylock (*futex);
|
|
}
|