This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 09/14] Add a configure option to enable lock elision and disable by default
- From: Andi Kleen <andi at firstfloor dot org>
- To: libc-alpha at sourceware dot org
- Cc: Andi Kleen <ak at linux dot jf dot intel dot com>
- Date: Thu, 27 Jun 2013 22:51:52 -0700
- Subject: [PATCH 09/14] Add a configure option to enable lock elision and disable by default
- References: <1372398717-16530-1-git-send-email-andi at firstfloor dot org>
From: Andi Kleen <ak@linux.intel.com>
Can be enabled with --enable-lock-elision=on at configure time.
When the option is not specified elision can be still enabled
by setting the environment variables or by the program setting
elision lock types directly.
Later the default could be switched to be on by default.
2013-06-18 Andi Kleen <ak@linux.intel.com>
* config.h.in (ENABLE_LOCK_ELISION): Add.
* configure: Regenerate.
* configure.in (--enable-lock-elision): Add option.
* manual/install.texi: Document --enable lock elision.
* nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c (elision_init):
Check ENABLE_LOCK_ELISION.
---
config.h.in | 3 +++
configure | 16 ++++++++++++++++
configure.in | 9 +++++++++
manual/install.texi | 3 +++
nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c | 3 +++
5 files changed, 34 insertions(+)
diff --git a/config.h.in b/config.h.in
index b5c6f16..6284e2a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -164,6 +164,9 @@
/* Define if __stack_chk_guard canary should be randomized at program startup. */
#undef ENABLE_STACKGUARD_RANDOMIZE
+/* Define if lock elision should be enabled by default. */
+#undef ENABLE_LOCK_ELISION
+
/* Package description. */
#undef PKGVERSION
diff --git a/configure b/configure
index 14bff72..bfc74eb 100755
--- a/configure
+++ b/configure
@@ -742,6 +742,7 @@ enable_versioning
enable_oldest_abi
enable_hardcoded_path_in_tests
enable_stackguard_randomization
+enable_lock_elision
enable_add_ons
enable_hidden_plt
enable_bind_now
@@ -1399,6 +1400,9 @@ Optional Features:
--enable-stackguard-randomization
initialize __stack_chk_guard canary with a random
number at program start
+ --enable-lock-elision=on/off
+ Enable lock elision for pthread mutexes and rwlocks
+ by default
--enable-add-ons[=DIRS...]
configure and build add-ons in DIR1,DIR2,... search
for add-ons if no parameter given
@@ -3472,6 +3476,18 @@ if test "$enable_stackguard_randomize" = yes; then
fi
+# Check whether --enable-lock-elision was given.
+if test "${enable_lock_elision+set}" = set; then :
+ enableval=$enable_lock_elision; enable_lock_elision=$enableval
+else
+ enable_lock_elision=no
+fi
+
+if test "$enable_lock_elision" = yes -o "$enable_lock_elision" = on ; then
+ $as_echo "#define ENABLE_LOCK_ELISION 1" >>confdefs.h
+
+fi
+
# Check whether --enable-add-ons was given.
if test "${enable_add_ons+set}" = set; then :
enableval=$enable_add_ons;
diff --git a/configure.in b/configure.in
index 56cd61c..a779c49 100644
--- a/configure.in
+++ b/configure.in
@@ -184,6 +184,15 @@ if test "$enable_stackguard_randomize" = yes; then
AC_DEFINE(ENABLE_STACKGUARD_RANDOMIZE)
fi
+AC_ARG_ENABLE([lock-elision],
+ AC_HELP_STRING([--enable-lock-elision[=on/off]],
+ [Enable lock elision for pthread mutexes and rwlocks by default]),
+ [enable_lock_elision=$enableval],
+ [enable_lock_elision=no])
+if test "$enable_lock_elision" = yes -o "$enable_lock_elision" = on ; then
+ AC_DEFINE(ENABLE_LOCK_ELISION)
+fi
+
dnl Generic infrastructure for drop-in additions to libc.
AC_ARG_ENABLE([add-ons],
AC_HELP_STRING([--enable-add-ons@<:@=DIRS...@:>@],
diff --git a/manual/install.texi b/manual/install.texi
index 3608a11..3e5358b 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -160,6 +160,9 @@ By default, dynamic tests are linked to run with the installed C library.
This option hardcodes the newly built C library path in dynamic tests
so that they can be invoked directly.
+@item --enable-lock-elision
+Enable lock elision for pthread mutexes and rwlocks by default.
+
@item --build=@var{build-system}
@itemx --host=@var{host-system}
These options are for cross-compiling. If you specify both options and
diff --git a/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c b/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c
index bb217f3..c0c40e7 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c
+++ b/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c
@@ -16,6 +16,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include "config.h"
#include <pthreadP.h>
#include <init-arch.h>
#include <elision-conf.h>
@@ -70,8 +71,10 @@ elision_init (int argc __attribute__ ((unused)),
char **environ)
{
__elision_available = HAS_RTM;
+#ifdef ENABLE_LOCK_ELISION
__pthread_force_elision = __libc_enable_secure ? 0 : __elision_available;
__rwlock_rtm_enabled = __libc_enable_secure ? 0 : __elision_available;
+#endif
}
#ifdef SHARED
--
1.8.1.4