This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] Tunable elision patch for siddhesh/tunables


Siddhesh et al,

In continuing the glibc tunables discussion, I've made some
additional patches which I think would help our work on the
siddhesh/tunables branch.

I've split this into two patches:

* The first should enable tunables to initialize without
calling malloc(), and prior to __environ being set.

* The second adds a common tunables initialization function
for elision, and enables it for supported archs.

I have tested this on PPC64. I need help testing for
supported s390 and x86 platforms.

Thanks,
Paul
>From 23e052dd8b0513a05e1780c6cecf0d0827b9606d Mon Sep 17 00:00:00 2001
From: Paul E. Murphy <murphyp@linux.vnet.ibm.com>
Date: Tue, 29 Sep 2015 12:04:35 -0500
Subject: [PATCH 1/2] tunables: Enable earlier initialization

The tradeoff is the tunable value lengths are restricted, the upside
is that we don't do strange things like malloc'ing while initializing
malloc while initializing a tunable within an init section.

For now, 128B is statically allocated to store the value string of
each tunable.  It should be easy to refactor this if problematic.

Inside gen-tunables.awk, It now precomputes the length of the tunable
strings as we can no longer use the previous tricks when parsing the
env var.  This also saves a few cycles to avoid useless comparisons.

This adds additional support for early init tunables to pass in the
environment as it may not be configured yet.

2015-09-29  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>

	* scripts/gen-tunables.awk: Precompute string length, and
	fix missing newline at EOF.
	* tunables/tunables.c (parse_tunable_string): Rewrite to avoid
	dynamic memory allocations.
	(tunable_register): Add optional environment parameter.
	(tunables_init): Update usage of val.
	* tunables/tunable-list.h: Regenerate.
	* tunables/tunables.h (TUNABLE_REGISTER_WITH_ENV): New macro.
	(TUNABLE_REGISTER_FULL): Add extra parameter to call of
	tunable_register.
	(tunable_t): Shuffle and allocate value string from within.
	(tunable_register): Add optional environ parameter.
	(TUNABLE_VAL_LEN): New macro.
---
 scripts/gen-tunables.awk |    6 ++--
 tunables/tunable-list.h  |   26 ++++++++++++------------
 tunables/tunables.c      |   50 ++++++++++++++++++++++++++++-----------------
 tunables/tunables.h      |   14 ++++++++++--
 4 files changed, 58 insertions(+), 38 deletions(-)

diff --git a/scripts/gen-tunables.awk b/scripts/gen-tunables.awk
index 56e54f2..a036a4a 100644
--- a/scripts/gen-tunables.awk
+++ b/scripts/gen-tunables.awk
@@ -71,11 +71,11 @@ END {
   for (t in val) {
     for (n in val[t]) {
       for (c in val[t][n]) {
-        printf ("  {TUNABLE_NAME_S(%s, %s, %s), NULL, NULL, false},\n",
-		t, n, val[t][n][c], t, n, val[t][n][c]);
+        printf ("  {TUNABLE_NAME_S(%s, %s, %s), NULL, %d, false, {0}},\n",
+		t, n, val[t][n][c], length (t n val[t][n][c] ".."));
       }
     }
   }
   print "};"
-  printf "#endif"
+  print "#endif"
 }
diff --git a/tunables/tunable-list.h b/tunables/tunable-list.h
index 3d99b81..b4ef72c 100644
--- a/tunables/tunable-list.h
+++ b/tunables/tunable-list.h
@@ -7,25 +7,25 @@
 
 typedef enum
 {
-  TUNABLE_ENUM_NAME(glibc, malloc, check),
-  TUNABLE_ENUM_NAME(glibc, malloc, top_pad),
-  TUNABLE_ENUM_NAME(glibc, malloc, perturb),
-  TUNABLE_ENUM_NAME(glibc, malloc, mmap_threshold),
   TUNABLE_ENUM_NAME(glibc, malloc, trim_threshold),
   TUNABLE_ENUM_NAME(glibc, malloc, mmap_max),
   TUNABLE_ENUM_NAME(glibc, malloc, arena_max),
   TUNABLE_ENUM_NAME(glibc, malloc, arena_test),
+  TUNABLE_ENUM_NAME(glibc, malloc, check),
+  TUNABLE_ENUM_NAME(glibc, malloc, top_pad),
+  TUNABLE_ENUM_NAME(glibc, malloc, perturb),
+  TUNABLE_ENUM_NAME(glibc, malloc, mmap_threshold),
 } tunable_id_t;
 
 #ifdef TUNABLES_INTERNAL
 static tunable_t tunable_list[] = {
-  {TUNABLE_NAME_S(glibc, malloc, check), NULL, NULL, false},
-  {TUNABLE_NAME_S(glibc, malloc, top_pad), NULL, NULL, false},
-  {TUNABLE_NAME_S(glibc, malloc, perturb), NULL, NULL, false},
-  {TUNABLE_NAME_S(glibc, malloc, mmap_threshold), NULL, NULL, false},
-  {TUNABLE_NAME_S(glibc, malloc, trim_threshold), NULL, NULL, false},
-  {TUNABLE_NAME_S(glibc, malloc, mmap_max), NULL, NULL, false},
-  {TUNABLE_NAME_S(glibc, malloc, arena_max), NULL, NULL, false},
-  {TUNABLE_NAME_S(glibc, malloc, arena_test), NULL, NULL, false},
+  {TUNABLE_NAME_S(glibc, malloc, trim_threshold), NULL, 27, false, {0}},
+  {TUNABLE_NAME_S(glibc, malloc, mmap_max), NULL, 21, false, {0}},
+  {TUNABLE_NAME_S(glibc, malloc, arena_max), NULL, 22, false, {0}},
+  {TUNABLE_NAME_S(glibc, malloc, arena_test), NULL, 23, false, {0}},
+  {TUNABLE_NAME_S(glibc, malloc, check), NULL, 18, false, {0}},
+  {TUNABLE_NAME_S(glibc, malloc, top_pad), NULL, 20, false, {0}},
+  {TUNABLE_NAME_S(glibc, malloc, perturb), NULL, 20, false, {0}},
+  {TUNABLE_NAME_S(glibc, malloc, mmap_threshold), NULL, 27, false, {0}},
 };
-#endif
\ No newline at end of file
+#endif
diff --git a/tunables/tunables.c b/tunables/tunables.c
index fe1913a..8e3e8eb 100644
--- a/tunables/tunables.c
+++ b/tunables/tunables.c
@@ -34,36 +34,45 @@ static int initialized = 0;
 
 /* The string is a space separated list of name=value for each tunable.  */
 static void
-parse_tunable_string (const char *str)
+parse_tunable_string (char * str)
 {
-  char *input = strdup (str);
-  char *in = input;
-
-  while (input != NULL)
+  while (*str != '\0')
     {
-      char *end = strchr (input, ' ');
+      char *end = strchr (str, ' ');
+      char *equals = strchr (str, '=');
+
+      if (!end)
+	end = str + strlen (str);
 
-      if (end != NULL)
-	*end++ = '\0';
+      /* Precompute the lengths of potential parameter and value */
+      intptr_t str_len = equals - str;
+      intptr_t eql_len = end - (equals + 1);
 
-      char *equals = strchr (input, '=');
-      if (equals != NULL)
+      /* Make sure we found a delimiter, not 'foo bar=baz' like case.  */
+      if (equals != NULL && equals < end)
 	{
-	  *equals++ = '\0';
 	  for (int i = 0; i < sizeof (tunable_list) / sizeof (tunable_t); i++)
 	    {
-	      if (strcmp (input, tunable_list[i].name) == 0)
+	      /* Don't bother comparing if the length mismatches.  */
+              if (str_len != tunable_list[i].name_len)
+		continue;
+	      /* Don't record if we can't catch it all.  */
+	      if (eql_len > TUNABLE_VAL_LEN)
+		continue;
+
+	      if (strncmp (str, tunable_list[i].name,
+		      tunable_list[i].name_len) == 0)
 		{
-		  tunable_list[i].val = strdup (equals);
+		  memcpy (tunable_list[i].val, equals + 1, eql_len);
+		  tunable_list[i].val[TUNABLE_VAL_LEN] = 0;
 		  break;
 		}
 	    }
 	}
 
-      input = end;
+      /* Chomp the delimiter, if any.  */
+      str = (*end == ' ') ? end + 1 : end;
     }
-
-  free (in);
 }
 
 static void
@@ -137,7 +146,7 @@ compat_tunables_init_envvars (struct compat_tunable_env *envvars, int count)
 	  /* We have a match.  Initialize and move on to the next line.  */
 	  if (memcmp (envline, name, MIN(len, strlen (name))) == 0)
 	    {
-	      cur->val = strdup (&envline[len + 1]);
+	      strncpy (cur->val, &envline[len + 1], TUNABLE_VAL_LEN);
 	      cur->set (cur->val);
 	      cur->initialized = true;
 	      break;
@@ -154,11 +163,14 @@ compat_tunables_init_envvars (struct compat_tunable_env *envvars, int count)
 
 /* Initialize a tunable and set its value.  */
 void
-tunable_register (tunable_id_t id, tunable_setter_t set_func)
+tunable_register (tunable_id_t id, tunable_setter_t set_func, char **envp)
 {
+  if (!envp)
+    envp = __environ;
+
   if (atomic_load_acquire (&initialized) == 0)
     {
-      tunables_init (__environ);
+      tunables_init (envp);
       atomic_store_release (&initialized, 1);
     }
 
diff --git a/tunables/tunables.h b/tunables/tunables.h
index 9d7e8bc..c35222d 100644
--- a/tunables/tunables.h
+++ b/tunables/tunables.h
@@ -20,13 +20,17 @@
 
 typedef void (*tunable_setter_t) (const char *);
 
+/* Maximum strlen() of a tunable value. Arbitrary. */
+#define TUNABLE_VAL_LEN 127
+
 /* A tunable.  */
 struct _tunable
 {
   const char *name;
-  const char *val;
   tunable_setter_t set;
+  long name_len;
   bool initialized;
+  char val[TUNABLE_VAL_LEN + 1];
 };
 
 typedef struct _tunable tunable_t;
@@ -40,13 +44,17 @@ struct compat_tunable_env
 };
 
 extern void compat_tunables_init_envvars (struct compat_tunable_env *, int);
-extern void tunable_register (tunable_id_t, tunable_setter_t);
+extern void tunable_register (tunable_id_t, tunable_setter_t, char **);
 
 #define TUNABLE_REGISTER(ns,id,set) \
   TUNABLE_REGISTER_FULL (TOP_NAMESPACE, ns, id, set)
 
 #define TUNABLE_REGISTER_FULL(tns,ns,id,set) \
-  tunable_register (TUNABLE_ENUM_NAME (tns, ns, id), (set))
+  tunable_register (TUNABLE_ENUM_NAME (tns, ns, id), (set), NULL)
+
+/* If you're registering _early_ you'll likely need to call this.  */
+#define TUNABLE_REGISTER_WITH_ENV(ns,id,set,envp) \
+  tunable_register (TUNABLE_ENUM_NAME (TOP_NAMESPACE, ns, id), (set), envp)
 
 #define ADD_COMPAT_TUNABLE_ENV(__id,__env) \
 ({									      \
-- 
1.7.1

>From 97cc7879757c3269613a5026046470f4eda8e9ba Mon Sep 17 00:00:00 2001
From: Paul E. Murphy <murphyp@linux.vnet.ibm.com>
Date: Wed, 23 Sep 2015 15:16:41 -0500
Subject: [PATCH 2/2] Add elision tunables

This patch adds several new tunables to control the behavior of
elision on supported platforms.  This also disables elision
by default on powerpc.

The tunable names are slightly munged to remove architecture
specific terms.  Otherwise, the elision implementation is
roughly identical on all supported platforms.

2015-09-23  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>

	* nptl/elision-tunables.c: New file.
	* sysdeps/unix/sysv/linux/powerpc/elision-conf.c:
	(ELISION_ENABLE): New macro.
	(ELISION_SKIP_LOCK_BUSY): Likewise.
	(ELISION_SKIP_LOCK_INTERNAL_ABORT): Likewise.
	(ELISION_SKIP_LOCK_AFTER_RETRIES): Likewise.
	(ELISION_TRIES): Likewise.
	(ELISION_TRYLOCK_INTERNAL_ABORT): Likewise.
	(ELISION_CAN_ENABLE): Likewise.
	(elision_init): Add hook to tunable function.
	* sysdeps/unix/sysv/linux/s390/elision-conf.c:
	Likewise.
	* sysdeps/unix/sysv/linux/x86/elision-conf.c:
	(ELISION_ENABLE): New macro.
	(ELISION_SKIP_LOCK_BUSY): Likewise.
	(ELISION_SKIP_LOCK_INTERNAL_ABORT): Likewise.
	(ELISION_TRIES): Likewise.
	(ELISION_TRYLOCK_INTERNAL_ABORT): Likewise.
	(ELISION_CAN_ENABLE): Likewise.
	(elision_init): Add hook to tunable function.
	* tunables/tunable-list.h (tunable_register): Regenerate.
	* tunables/tunable.list: Add elision parameters.
---
 nptl/elision-tunables.c                        |   72 ++++++++++++++++++++++++
 sysdeps/unix/sysv/linux/powerpc/elision-conf.c |   18 +++++-
 sysdeps/unix/sysv/linux/s390/elision-conf.c    |   19 ++++++-
 sysdeps/unix/sysv/linux/x86/elision-conf.c     |   12 ++++
 tunables/tunable-list.h                        |   12 ++++
 tunables/tunables.list                         |    8 +++
 6 files changed, 138 insertions(+), 3 deletions(-)
 create mode 100644 nptl/elision-tunables.c

diff --git a/nptl/elision-tunables.c b/nptl/elision-tunables.c
new file mode 100644
index 0000000..734414c
--- /dev/null
+++ b/nptl/elision-tunables.c
@@ -0,0 +1,72 @@
+/* Copyright (C) 2015 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/>.  */
+
+#define TUNABLE_NAMESPACE pthread
+#include <tunables/tunables.h>
+
+/* Define a function to parse an integral tunable value and
+   set the pointer this value.  */
+#define _ELISION_TUNABLE_INT_FUNC(tunable, ptr) \
+  void \
+  _elision_set_ ## tunable (const char * value) \
+  { \
+    *ptr = atoi (value); \
+  }
+
+/* Define some helper macros to register a tunable, and
+   define the setter function.  Note, this defines a
+   nested function, and the tunable macro likely resolves
+   to a function call.  */
+#define _ELISION_TUNABLE_REGISTER(name, mname) \
+  _ELISION_TUNABLE_INT_FUNC (name, mname); \
+  TUNABLE_REGISTER_WITH_ENV (pthread, elision_ ## name, \
+  			     &_elision_set_ ## name, envp)
+
+/* Initialize the tunables based on what the platform has defined as
+   being available.  */
+static void __attribute__((unused))
+elision_init_tunables (char **envp)
+{
+  /* Don't attempt to do anything if elision isn't supported */
+  if (!ELISION_CAN_ENABLE || __libc_enable_secure)
+    return;
+
+  _ELISION_TUNABLE_REGISTER (enable, ELISION_ENABLE);
+
+#ifdef ELISION_SKIP_LOCK_BUSY
+  _ELISION_TUNABLE_REGISTER (skip_lock_busy, ELISION_SKIP_LOCK_BUSY);
+#endif
+
+#ifdef ELISION_SKIP_LOCK_INTERNAL_ABORT
+  _ELISION_TUNABLE_REGISTER (skip_lock_internal_abort,
+  			     ELISION_SKIP_LOCK_INTERNAL_ABORT);
+#endif
+
+#ifdef ELISION_SKIP_LOCK_AFTER_RETRIES
+  _ELISION_TUNABLE_REGISTER (skip_lock_after_retries,
+  			     ELISION_SKIP_LOCK_AFTER_RETRIES);
+#endif
+
+#ifdef ELISION_TRIES
+  _ELISION_TUNABLE_REGISTER (tries, ELISION_TRIES);
+#endif
+
+#ifdef ELISION_SKIP_TRYLOCK_INTERNAL_ABORT
+  _ELISION_TUNABLE_REGISTER (skip_trylock_internal_abort,
+  			     ELISION_SKIP_TRYLOCK_INTERNAL_ABORT);
+#endif
+}
diff --git a/sysdeps/unix/sysv/linux/powerpc/elision-conf.c b/sysdeps/unix/sysv/linux/powerpc/elision-conf.c
index 5341222..7980ffc 100644
--- a/sysdeps/unix/sysv/linux/powerpc/elision-conf.c
+++ b/sysdeps/unix/sysv/linux/powerpc/elision-conf.c
@@ -22,6 +22,19 @@
 #include <unistd.h>
 #include <dl-procinfo.h>
 
+#define ELISION_ENABLE (&__pthread_force_elision)
+#define ELISION_SKIP_LOCK_BUSY (&__elision_aconf.skip_lock_busy)
+#define ELISION_SKIP_LOCK_INTERNAL_ABORT \
+  (&__elision_aconf.skip_lock_internal_abort)
+#define ELISION_SKIP_LOCK_AFTER_RETRIES \
+  (&__elision_aconf.skip_lock_out_of_tbegin_retries)
+#define ELISION_TRIES (&__elision_aconf.try_tbegin)
+#define ELISION_SKIP_TRYLOCK_INTERNAL_ABORT \
+  (&__elision_aconf.skip_trylock_internal_abort)
+#define ELISION_CAN_ENABLE ((GLRO (dl_hwcap2) & PPC_FEATURE2_HAS_HTM))
+
+#include "elision-tunables.c"
+
 /* Reasonable initial tuning values, may be revised in the future.
    This is a conservative initial value.  */
 
@@ -60,8 +73,9 @@ elision_init (int argc __attribute__ ((unused)),
 	      char **environ)
 {
 #ifdef ENABLE_LOCK_ELISION
-  int elision_available = (GLRO (dl_hwcap2) & PPC_FEATURE2_HAS_HTM) ? 1 : 0;
-  __pthread_force_elision = __libc_enable_secure ? 0 : elision_available;
+  /* Note, elision must be explicitly turned on by setting the
+     appropriate tunable on a supported platform.  */
+  elision_init_tunables (environ);
 #endif
   if (!__pthread_force_elision)
     /* Disable elision on rwlocks.  */
diff --git a/sysdeps/unix/sysv/linux/s390/elision-conf.c b/sysdeps/unix/sysv/linux/s390/elision-conf.c
index e1ff599..4279bcb 100644
--- a/sysdeps/unix/sysv/linux/s390/elision-conf.c
+++ b/sysdeps/unix/sysv/linux/s390/elision-conf.c
@@ -22,6 +22,19 @@
 #include <unistd.h>
 #include <dl-procinfo.h>
 
+#define ELISION_ENABLE (&__pthread_force_elision)
+#define ELISION_SKIP_LOCK_BUSY (&__elision_aconf.skip_lock_busy)
+#define ELISION_SKIP_LOCK_INTERNAL_ABORT \
+  (&__elision_aconf.skip_lock_internal_abort)
+#define ELISION_SKIP_LOCK_AFTER_RETRIES \
+  (&__elision_aconf.skip_lock_out_of_tbegin_retries)
+#define ELISION_TRIES (&__elision_aconf.try_tbegin)
+#define ELISION_SKIP_TRYLOCK_INTERNAL_ABORT \
+  (&__elision_aconf.skip_trylock_internal_abort)
+#define ELISION_CAN_ENABLE (GLRO (dl_hwcap) & HWCAP_S390_TE)
+
+#include "elision-tunables.c"
+
 /* Reasonable initial tuning values, may be revised in the future.
    This is a conservative initial value.  */
 
@@ -62,9 +75,13 @@ elision_init (int argc __attribute__ ((unused)),
 {
   /* Set when the CPU and the kernel supports transactional execution.
      When false elision is never attempted.  */
-  int elision_available = (GLRO (dl_hwcap) & HWCAP_S390_TE) ? 1 : 0;
+  int elision_available = ELISION_SHOULD_ENABLE ? 1 : 0;
 
+  /* Enable elision, if available, by default.  */
   __pthread_force_elision = __libc_enable_secure ? 0 : elision_available;
+
+  /* Update any tunables as desired.  */
+  elision_init_tunables (environ);
 }
 
 #ifdef SHARED
diff --git a/sysdeps/unix/sysv/linux/x86/elision-conf.c b/sysdeps/unix/sysv/linux/x86/elision-conf.c
index 4a73382..73a0152 100644
--- a/sysdeps/unix/sysv/linux/x86/elision-conf.c
+++ b/sysdeps/unix/sysv/linux/x86/elision-conf.c
@@ -22,6 +22,17 @@
 #include <elision-conf.h>
 #include <unistd.h>
 
+#define ELISION_ENABLE (&__pthread_force_elision)
+#define ELISION_SKIP_LOCK_BUSY (&__elision_aconf.skip_lock_busy)
+#define ELISION_SKIP_LOCK_INTERNAL_ABORT \
+  (&__elision_aconf.skip_lock_internal_abort)
+#define ELISION_TRIES (&__elision_aconf.retry_try_xbegin)
+#define ELISION_SKIP_TRYLOCK_INTERNAL_ABORT \
+  (&__elision_aconf.skip_trylock_internal_abort)
+#define ELISION_CAN_ENABLE (HAS_CPU_FEATURE (RTM))
+
+#include "elision-tunables.c"
+
 /* Reasonable initial tuning values, may be revised in the future.
    This is a conservative initial value.  */
 
@@ -65,6 +76,7 @@ elision_init (int argc __attribute__ ((unused)),
   __elision_available = HAS_CPU_FEATURE (RTM);
 #ifdef ENABLE_LOCK_ELISION
   __pthread_force_elision = __libc_enable_secure ? 0 : __elision_available;
+  elision_init_tunables (environ);
 #endif
   if (!HAS_CPU_FEATURE (RTM))
     __elision_aconf.retry_try_xbegin = 0; /* Disable elision on rwlocks */
diff --git a/tunables/tunable-list.h b/tunables/tunable-list.h
index b4ef72c..5106346 100644
--- a/tunables/tunable-list.h
+++ b/tunables/tunable-list.h
@@ -7,6 +7,12 @@
 
 typedef enum
 {
+  TUNABLE_ENUM_NAME(glibc, pthread, elision_tries),
+  TUNABLE_ENUM_NAME(glibc, pthread, elision_skip_trylock_internal_abort),
+  TUNABLE_ENUM_NAME(glibc, pthread, elision_enable),
+  TUNABLE_ENUM_NAME(glibc, pthread, elision_skip_lock_busy),
+  TUNABLE_ENUM_NAME(glibc, pthread, elision_skip_lock_internal_abort),
+  TUNABLE_ENUM_NAME(glibc, pthread, elision_skip_lock_after_retries),
   TUNABLE_ENUM_NAME(glibc, malloc, trim_threshold),
   TUNABLE_ENUM_NAME(glibc, malloc, mmap_max),
   TUNABLE_ENUM_NAME(glibc, malloc, arena_max),
@@ -19,6 +25,12 @@ typedef enum
 
 #ifdef TUNABLES_INTERNAL
 static tunable_t tunable_list[] = {
+  {TUNABLE_NAME_S(glibc, pthread, elision_tries), NULL, 27, false, {0}},
+  {TUNABLE_NAME_S(glibc, pthread, elision_skip_trylock_internal_abort), NULL, 49, false, {0}},
+  {TUNABLE_NAME_S(glibc, pthread, elision_enable), NULL, 28, false, {0}},
+  {TUNABLE_NAME_S(glibc, pthread, elision_skip_lock_busy), NULL, 36, false, {0}},
+  {TUNABLE_NAME_S(glibc, pthread, elision_skip_lock_internal_abort), NULL, 46, false, {0}},
+  {TUNABLE_NAME_S(glibc, pthread, elision_skip_lock_after_retries), NULL, 45, false, {0}},
   {TUNABLE_NAME_S(glibc, malloc, trim_threshold), NULL, 27, false, {0}},
   {TUNABLE_NAME_S(glibc, malloc, mmap_max), NULL, 21, false, {0}},
   {TUNABLE_NAME_S(glibc, malloc, arena_max), NULL, 22, false, {0}},
diff --git a/tunables/tunables.list b/tunables/tunables.list
index f1335cc..d7a677b 100644
--- a/tunables/tunables.list
+++ b/tunables/tunables.list
@@ -9,4 +9,12 @@ glibc {
     arena_max
     arena_test
   }
+  pthread {
+    elision_enable
+    elision_skip_lock_busy
+    elision_skip_lock_internal_abort
+    elision_skip_lock_after_retries
+    elision_tries
+    elision_skip_trylock_internal_abort
+  }
 }
-- 
1.7.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]