Message ID | 1531185457-28752-1-git-send-email-kemi.wang@intel.com |
---|---|
State | New |
Headers | show |
Series | [v8] Mutex: Add pthread mutex tunables | expand |
On 2018年07月10日 09:17, Kemi Wang wrote: > This patch does not have any functionality change, we only provide a spin > count tunes for pthread adaptive spin mutex. The tunable > glibc.pthread.mutex_spin_count tunes can be used by system administrator to > squeeze system performance according to different hardware capabilities and > workload characteristics. > > 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. > > * sysdeps/nptl/dl-tunables.list: Add glibc.pthread.mutex_spin_count entry. > * manual/tunables.texi: Add glibc.pthread.mutex_spin_count description. > * sysdeps/nptl/pthread_mutex_conf.h: New file. > * nptl/pthread_mutex_conf.c: New file. > * nptl/Makefile: Add pthread_mutex_conf.c for compilation. > * nptl/nptl-init.c: Put pthread mutex tunable initialization in pthread > initialization. > * nptl/pthreadP.h: Move MAX_ADAPTIVE_COUNT macro definition to > pthread_mutex_conf.h > > I would extend my appreciation sincerely to H.J.Lu for his help to refine > this patch series. > > ChangeLog: > V7->V8: > a) Refine the pthread tunables description in manual/tunables.texi > accordingly to Carlos O'Donell and Rical Jason. > > V6->V7: > a) Patch is refined by H.J.Lu > > V5->V6: > a) Missing "pthread mutex tunables" entry in the menu of tunables.texi, > add it. > > V4->V5 > a) Put mutex tunable (glibc.mutex.spin_count) initialization as part of > overall pthread initialization, that would avoid the extra relocation, > as suggested by Florian Weimer. Thanks for pointing it out! > b) Move the READ_ONLY_SPIN macro definition from the third patch to > this patch > > V3->V4 > a) Add comments in elf/dl-tunables.list > > V2->V3 > a) Polish the description of glibc.mutex.spin_count tunable with the > help from Rical Jasan. > b) Get rid of the TUNABLE_CALLBACK_FNDECL macros in > pthread_mutex_conf.c, as suggested by Florian Weimer. > c) Adjust the default value of spin count to 100 with the reference of > the previous spinning way via trylock. > > V1->V2 > a) Renamed nptl/mutex-conf.h -> nptl/pthread_mutex_conf.h > b) Renamed nptl/mutex-conf.c -> nptl/pthread_mutex_conf.c > c) Change the Makefile to compile pthread_mutex_conf.c > d) Modify the copyright "2013-2018" -> "2018" for new added files > e) Fix the indentation issue (tab -> double space) in > elf/dl-tunables.list > f) Remove the env alias LD_SPIN_COUNT in elf/dl-tunables.list > g) Fix the typo errors and refresh glibc.mutex.spin_count tunable > description in manual/tunables.texi. > h) Fix the indentation issue in nptl/pthread_mutex_conf.c > i) Fix the indentation issue for nested preprocessor (add one space for > each level) > > Reviewed-by: Carlos O'Donell <carlos@redhat.com> > Suggested-by: Andi Kleen <andi.kleen@intel.com> > Signed-off-by: Kemi.wang <kemi.wang@intel.com> > --- PING Anything else I need to do for this patch?
On Mon, Jul 9, 2018 at 6:17 PM, Kemi Wang <kemi.wang@intel.com> wrote: > This patch does not have any functionality change, we only provide a spin > count tunes for pthread adaptive spin mutex. The tunable > glibc.pthread.mutex_spin_count tunes can be used by system administrator to > squeeze system performance according to different hardware capabilities and > workload characteristics. > > 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. > > * sysdeps/nptl/dl-tunables.list: Add glibc.pthread.mutex_spin_count entry. > * manual/tunables.texi: Add glibc.pthread.mutex_spin_count description. > * sysdeps/nptl/pthread_mutex_conf.h: New file. > * nptl/pthread_mutex_conf.c: New file. > * nptl/Makefile: Add pthread_mutex_conf.c for compilation. > * nptl/nptl-init.c: Put pthread mutex tunable initialization in pthread > initialization. > * nptl/pthreadP.h: Move MAX_ADAPTIVE_COUNT macro definition to > pthread_mutex_conf.h > > I would extend my appreciation sincerely to H.J.Lu for his help to refine > this patch series. > > ChangeLog: > V7->V8: > a) Refine the pthread tunables description in manual/tunables.texi > accordingly to Carlos O'Donell and Rical Jason. > > V6->V7: > a) Patch is refined by H.J.Lu > > V5->V6: > a) Missing "pthread mutex tunables" entry in the menu of tunables.texi, > add it. > > V4->V5 > a) Put mutex tunable (glibc.mutex.spin_count) initialization as part of > overall pthread initialization, that would avoid the extra relocation, > as suggested by Florian Weimer. Thanks for pointing it out! > b) Move the READ_ONLY_SPIN macro definition from the third patch to > this patch > > V3->V4 > a) Add comments in elf/dl-tunables.list > > V2->V3 > a) Polish the description of glibc.mutex.spin_count tunable with the > help from Rical Jasan. > b) Get rid of the TUNABLE_CALLBACK_FNDECL macros in > pthread_mutex_conf.c, as suggested by Florian Weimer. > c) Adjust the default value of spin count to 100 with the reference of > the previous spinning way via trylock. > > V1->V2 > a) Renamed nptl/mutex-conf.h -> nptl/pthread_mutex_conf.h > b) Renamed nptl/mutex-conf.c -> nptl/pthread_mutex_conf.c > c) Change the Makefile to compile pthread_mutex_conf.c > d) Modify the copyright "2013-2018" -> "2018" for new added files > e) Fix the indentation issue (tab -> double space) in > elf/dl-tunables.list > f) Remove the env alias LD_SPIN_COUNT in elf/dl-tunables.list > g) Fix the typo errors and refresh glibc.mutex.spin_count tunable > description in manual/tunables.texi. > h) Fix the indentation issue in nptl/pthread_mutex_conf.c > i) Fix the indentation issue for nested preprocessor (add one space for > each level) > > Reviewed-by: Carlos O'Donell <carlos@redhat.com> > Suggested-by: Andi Kleen <andi.kleen@intel.com> > Signed-off-by: Kemi.wang <kemi.wang@intel.com> LGTM. Thanks.
On 2018年07月17日 19:21, H.J. Lu wrote: > On Mon, Jul 9, 2018 at 6:17 PM, Kemi Wang <kemi.wang@intel.com> wrote: >> This patch does not have any functionality change, we only provide a spin >> count tunes for pthread adaptive spin mutex. The tunable >> glibc.pthread.mutex_spin_count tunes can be used by system administrator to >> squeeze system performance according to different hardware capabilities and >> workload characteristics. >> >> 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. >> >> * sysdeps/nptl/dl-tunables.list: Add glibc.pthread.mutex_spin_count entry. >> * manual/tunables.texi: Add glibc.pthread.mutex_spin_count description. >> * sysdeps/nptl/pthread_mutex_conf.h: New file. >> * nptl/pthread_mutex_conf.c: New file. >> * nptl/Makefile: Add pthread_mutex_conf.c for compilation. >> * nptl/nptl-init.c: Put pthread mutex tunable initialization in pthread >> initialization. >> * nptl/pthreadP.h: Move MAX_ADAPTIVE_COUNT macro definition to >> pthread_mutex_conf.h >> >> I would extend my appreciation sincerely to H.J.Lu for his help to refine >> this patch series. >> >> ChangeLog: >> V7->V8: >> a) Refine the pthread tunables description in manual/tunables.texi >> accordingly to Carlos O'Donell and Rical Jason. >> >> V6->V7: >> a) Patch is refined by H.J.Lu >> >> V5->V6: >> a) Missing "pthread mutex tunables" entry in the menu of tunables.texi, >> add it. >> >> V4->V5 >> a) Put mutex tunable (glibc.mutex.spin_count) initialization as part of >> overall pthread initialization, that would avoid the extra relocation, >> as suggested by Florian Weimer. Thanks for pointing it out! >> b) Move the READ_ONLY_SPIN macro definition from the third patch to >> this patch >> >> V3->V4 >> a) Add comments in elf/dl-tunables.list >> >> V2->V3 >> a) Polish the description of glibc.mutex.spin_count tunable with the >> help from Rical Jasan. >> b) Get rid of the TUNABLE_CALLBACK_FNDECL macros in >> pthread_mutex_conf.c, as suggested by Florian Weimer. >> c) Adjust the default value of spin count to 100 with the reference of >> the previous spinning way via trylock. >> >> V1->V2 >> a) Renamed nptl/mutex-conf.h -> nptl/pthread_mutex_conf.h >> b) Renamed nptl/mutex-conf.c -> nptl/pthread_mutex_conf.c >> c) Change the Makefile to compile pthread_mutex_conf.c >> d) Modify the copyright "2013-2018" -> "2018" for new added files >> e) Fix the indentation issue (tab -> double space) in >> elf/dl-tunables.list >> f) Remove the env alias LD_SPIN_COUNT in elf/dl-tunables.list >> g) Fix the typo errors and refresh glibc.mutex.spin_count tunable >> description in manual/tunables.texi. >> h) Fix the indentation issue in nptl/pthread_mutex_conf.c >> i) Fix the indentation issue for nested preprocessor (add one space for >> each level) >> >> Reviewed-by: Carlos O'Donell <carlos@redhat.com> >> Suggested-by: Andi Kleen <andi.kleen@intel.com> >> Signed-off-by: Kemi.wang <kemi.wang@intel.com> > > LGTM. > thanks > Thanks. >
diff --git a/manual/tunables.texi b/manual/tunables.texi index be33c9f..b10b54c 100644 --- a/manual/tunables.texi +++ b/manual/tunables.texi @@ -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 diff --git a/nptl/Makefile b/nptl/Makefile index 2f2bb05..06e19e6 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -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 \ diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index 907411d..adf99f1 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -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) diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 3cba0b6..7ef3dfd 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -33,6 +33,7 @@ #include <kernel-features.h> #include <errno.h> #include <internal-signals.h> +#include <pthread_mutex_conf.h> /* Atomic operations on TLS memory. */ @@ -47,12 +48,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. */ diff --git a/nptl/pthread_mutex_conf.c b/nptl/pthread_mutex_conf.c new file mode 100644 index 0000000..e949926 --- /dev/null +++ b/nptl/pthread_mutex_conf.c @@ -0,0 +1,44 @@ +/* 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 +# define TUNABLE_NAMESPACE pthread +# include <stdbool.h> +# include <stdint.h> +# include <pthread_mutex_conf.h> +# include <elf/dl-tunables.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, +}; + +void +TUNABLE_CALLBACK (set_mutex_spin_count) (tunable_val_t *valp) +{ + __mutex_aconf.spin_count = (int32_t) (valp)->numval; +} + +void pthread_tunables_init (void) +{ + TUNABLE_GET (mutex_spin_count, int32_t, + TUNABLE_CALLBACK (set_mutex_spin_count)); +} +#endif diff --git a/sysdeps/nptl/dl-tunables.list b/sysdeps/nptl/dl-tunables.list new file mode 100644 index 0000000..1cb52e8 --- /dev/null +++ b/sysdeps/nptl/dl-tunables.list @@ -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 + } + } +} diff --git a/sysdeps/nptl/pthread_mutex_conf.h b/sysdeps/nptl/pthread_mutex_conf.h new file mode 100644 index 0000000..9bd15a2 --- /dev/null +++ b/sysdeps/nptl/pthread_mutex_conf.h @@ -0,0 +1,39 @@ +/* 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 + +struct mutex_config +{ + int spin_count; +}; + +extern struct mutex_config __mutex_aconf attribute_hidden; + +void pthread_tunables_init (void); + +/* 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 + +#endif