@@ -32,6 +32,7 @@ their own namespace.
* Tunable names:: The structure of a tunable name
* Memory Allocation Tunables:: Tunables in the memory allocation subsystem
* Elision Tunables:: Tunables in elision subsystem
+* POSIX Thread Tunables:: Tunables in the POSIX thread subsystem
* Hardware Capability Tunables:: Tunables that modify the hardware
capabilities seen by @theglibc{}
@end menu
@@ -281,6 +282,32 @@ of try lock attempts.
The default value of this tunable is @samp{3}.
@end deftp
+@node POSIX Thread Tunables
+@section POSIX Thread Tunables
+@cindex pthread mutex tunables
+@cindex thread mutex tunables
+@cindex mutex tunables
+@cindex tunables thread mutex
+
+@deftp {Tunable namespace} glibc.pthread
+The behavior of POSIX thread can be tuned to gain performance improvements
+according to specific hardware capabilities and workload characteristics by
+setting the following tunables in the @code{pthread} namespace:
+@end deftp
+
+@deftp Tunable glibc.pthread.mutex_spin_count
+The @code{glibc.pthread.mutex_spin_count} tunable sets the maximum number of times
+a thread should spin on the lock before calling into the kernel to block.
+Adaptive spin is used for mutexes initialized with the
+@code{PTHREAD_MUTEX_ADAPTIVE_NP} GNU extension. It affects both
+@code{pthread_mutex_lock} and @code{pthread_mutex_timedlock}.
+
+The spinning is done until either the maximum spin count is reached or
+the lock is acquired.
+
+The default value of this tunable is @samp{100}.
+@end deftp
+
@node Hardware Capability Tunables
@section Hardware Capability Tunables
@cindex hardware capability tunables
@@ -139,7 +139,8 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
pthread_mutex_getprioceiling \
pthread_mutex_setprioceiling \
pthread_setname pthread_getname \
- pthread_setattr_default_np pthread_getattr_default_np
+ pthread_setattr_default_np pthread_getattr_default_np \
+ pthread_mutex_conf
# pthread_setuid pthread_seteuid pthread_setreuid \
# pthread_setresuid \
# pthread_setgid pthread_setegid pthread_setregid \
@@ -38,6 +38,7 @@
#include <kernel-features.h>
#include <libc-pointer-arith.h>
#include <pthread-pids.h>
+#include <pthread_mutex_conf.h>
#ifndef TLS_MULTIPLE_THREADS_IN_TCB
/* Pointer to the corresponding variable in libc. */
@@ -431,6 +432,10 @@ __pthread_initialize_minimal_internal (void)
/* Determine whether the machine is SMP or not. */
__is_smp = is_smp_system ();
+
+#if HAVE_TUNABLES
+ pthread_tunables_init ();
+#endif
}
strong_alias (__pthread_initialize_minimal_internal,
__pthread_initialize_minimal)
@@ -47,12 +47,6 @@
#endif
-/* Adaptive mutex definitions. */
-#ifndef MAX_ADAPTIVE_COUNT
-# define MAX_ADAPTIVE_COUNT 100
-#endif
-
-
/* Magic cookie representing robust mutex with dead owner. */
#define PTHREAD_MUTEX_INCONSISTENT INT_MAX
/* Magic cookie representing not recoverable robust mutex. */
@@ -181,6 +175,24 @@ enum
#define __PTHREAD_COND_SHARED_MASK 1
+#if HAVE_TUNABLES
+struct mutex_config
+{
+ int spin_count;
+};
+
+extern struct mutex_config __mutex_aconf;
+#endif
+
+/* Adaptive mutex definitions. */
+#ifndef MAX_ADAPTIVE_COUNT
+# if HAVE_TUNABLES
+# define MAX_ADAPTIVE_COUNT __mutex_aconf.spin_count
+# else
+# define MAX_ADAPTIVE_COUNT 100
+# endif
+#endif
+
/* Internal variables. */
new file mode 100644
@@ -0,0 +1,27 @@
+/* pthread_mutex_conf.c: Pthread mutex tunable parameters.
+ Copyright (C) 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/>. */
+
+#if HAVE_TUNABLES
+#include <pthreadP.h>
+struct mutex_config __mutex_aconf =
+{
+ /* The maximum number of times a thread should spin on the lock before
+ calling into kernel to block. */
+ .spin_count = 100,
+};
+#endif
new file mode 100644
@@ -0,0 +1,45 @@
+/* pthread_mutex_conf.h: Pthread mutex tunable parameters.
+ Copyright (C) 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/>. */
+#ifndef _PTHREAD_MUTEX_CONF_H
+#define _PTHREAD_MUTEX_CONF_H 1
+
+#if HAVE_TUNABLES
+# define TUNABLE_NAMESPACE pthread
+# include <stdbool.h>
+# include <stdint.h>
+# include <pthreadP.h>
+# include <pthread_mutex_conf.h>
+# include <unistd.h> /* Get STDOUT_FILENO for _dl_printf. */
+# include <elf/dl-tunables.h>
+
+extern struct mutex_config __mutex_aconf attribute_hidden;
+
+static void
+TUNABLE_CALLBACK (set_mutex_spin_count) (tunable_val_t *valp)
+{
+ __mutex_aconf.spin_count = (int32_t) (valp)->numval;
+}
+
+static void pthread_tunables_init (void)
+{
+ TUNABLE_GET (mutex_spin_count, int32_t,
+ TUNABLE_CALLBACK (set_mutex_spin_count));
+}
+#endif
+
+#endif
new file mode 100644
@@ -0,0 +1,51 @@
+# Copyright (C) 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/>.
+
+# Allowed attributes for tunables:
+#
+# type: Defaults to STRING
+# minval: Optional minimum acceptable value
+# maxval: Optional maximum acceptable value
+# env_alias: An alias environment variable
+# security_level: Specify security level of the tunable. Valid values are:
+#
+# SXID_ERASE: (default) Don't read for AT_SECURE binaries and
+# removed so that child processes can't read it.
+# SXID_IGNORE: Don't read for AT_SECURE binaries, but retained for
+# non-AT_SECURE subprocesses.
+# NONE: Read all the time.
+
+
+# The maximum value of spin count is limited to 30000 to avoid the overflow
+# of mutex->__data.__spins variable with the possible type of short in
+# pthread_mutex_lock ().
+#
+# The default value of spin count is set to 100 with the reference to the
+# previous number of times of spinning via trylock. This value would be
+# architecture-specific and can be tuned with kinds of benchmarks to fit
+# most cases in future.
+
+glibc {
+ pthread {
+ mutex_spin_count {
+ type: INT_32
+ minval: 0
+ maxval: 30000
+ default: 100
+ }
+ }
+}