diff options
author | Dominik Vogt <vogt@linux.vnet.ibm.com> | 2014-05-09 16:58:46 +0200 |
---|---|---|
committer | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2014-05-09 16:58:46 +0200 |
commit | 5a414ff70c3a45e52b5f5c0741bd459a84cf56b8 (patch) | |
tree | 036ad6a707ea587149cb057f3e41b7bdd086cbdd /sysdeps | |
parent | f63c86fed0ddf38f53de486c5ec537455c00bd52 (diff) | |
download | glibc-5a414ff70c3a45e52b5f5c0741bd459a84cf56b8.zip glibc-5a414ff70c3a45e52b5f5c0741bd459a84cf56b8.tar.gz glibc-5a414ff70c3a45e52b5f5c0741bd459a84cf56b8.tar.bz2 |
S/390: Port of lock elision to System/z
Added support for TX lock elision of pthread mutexes on s390 and
s390x. This may improve lock scaling of existing programs on TX
capable systems. The lock elision code is only built with
--enable-lock-elision=yes and then requires a GCC version supporting
the TX builtins. With lock elision default mutexes are elided via
__builtin_tbegin, if the cpu supports transactions. By default lock
elision is not enabled and the elision code is not built.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/s390/configure | 36 | ||||
-rw-r--r-- | sysdeps/s390/configure.ac | 26 |
2 files changed, 62 insertions, 0 deletions
diff --git a/sysdeps/s390/configure b/sysdeps/s390/configure index c2d05f7..6948cc2 100644 --- a/sysdeps/s390/configure +++ b/sysdeps/s390/configure @@ -68,5 +68,41 @@ if test $ac_verc_fail = yes; then fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_tbegin" >&5 +$as_echo_n "checking for __builtin_tbegin... " >&6; } +if ${libc_cv_gcc_builtin_tbegin+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.c <<\EOF +#include <htmintrin.h> +void testtransaction () +{ + if (__builtin_tbegin (0) == _HTM_TBEGIN_STARTED) + { + __builtin_tend (); + } +} +EOF +if { ac_try='${CC-cc} -mhtm -O2 -S conftest.c -o - | grep -w tbegin > /dev/null' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } ; +then + libc_cv_gcc_builtin_tbegin=yes +else + libc_cv_gcc_builtin_tbegin=no +fi +rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_builtin_tbegin" >&5 +$as_echo "$libc_cv_gcc_builtin_tbegin" >&6; } + +if test "$enable_lock_elision" = yes && test "$libc_cv_gcc_builtin_tbegin" = no ; then + critic_missing="$critic_missing The used GCC has no support for __builtin_tbegin, which is needed for lock-elision on target S390." +fi + test -n "$critic_missing" && as_fn_error $? " *** $critic_missing" "$LINENO" 5 diff --git a/sysdeps/s390/configure.ac b/sysdeps/s390/configure.ac index 59cfdd1..493e9a4 100644 --- a/sysdeps/s390/configure.ac +++ b/sysdeps/s390/configure.ac @@ -10,5 +10,31 @@ AC_CHECK_PROG_VER(AS, $AS, --version, [GNU assembler.* \([0-9]*\.[0-9.]*\)], [2.2[4-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*], critic_missing="$critic_missing The program AS is required in version >= 2.24 for target S390.") + +AC_CACHE_CHECK(for __builtin_tbegin, libc_cv_gcc_builtin_tbegin, [dnl +cat > conftest.c <<\EOF +#include <htmintrin.h> +void testtransaction () +{ + if (__builtin_tbegin (0) == _HTM_TBEGIN_STARTED) + { + __builtin_tend (); + } +} +EOF +dnl +dnl test, if the tbegin instruction is used by __builtin_tbegin +if AC_TRY_COMMAND([${CC-cc} -mhtm -O2 -S conftest.c -o - | grep -w tbegin > /dev/null]) ; +then + libc_cv_gcc_builtin_tbegin=yes +else + libc_cv_gcc_builtin_tbegin=no +fi +rm -f conftest* ]) + +if test "$enable_lock_elision" = yes && test "$libc_cv_gcc_builtin_tbegin" = no ; then + critic_missing="$critic_missing The used GCC has no support for __builtin_tbegin, which is needed for lock-elision on target S390." +fi + test -n "$critic_missing" && AC_MSG_ERROR([ *** $critic_missing]) |