aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorDominik Vogt <vogt@linux.vnet.ibm.com>2014-05-09 16:58:46 +0200
committerAndreas Krebbel <krebbel@linux.vnet.ibm.com>2014-05-09 16:58:46 +0200
commit5a414ff70c3a45e52b5f5c0741bd459a84cf56b8 (patch)
tree036ad6a707ea587149cb057f3e41b7bdd086cbdd /sysdeps
parentf63c86fed0ddf38f53de486c5ec537455c00bd52 (diff)
downloadglibc-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/configure36
-rw-r--r--sysdeps/s390/configure.ac26
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])