From patchwork Wed Apr 25 02:56:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: kemi X-Patchwork-Id: 903939 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-91807-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=intel.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="YDuBPgFI"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40W4fM3kdWz9s0n for ; Wed, 25 Apr 2018 12:59:06 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id; q=dns; s= default; b=v5/tZLVl17y2U7KKvRWV/1xlMt24bsgP1sS8+GmJYkVjUGPopPRy+ QQXSQnZEe2LhYiLtjkvRfYlss3eAj80N942/NfA6Y91KLh2MpqNRJrdVf2hWGThE I+A1w8wahP+4//jWG+GibZmg00F5nqgkFNxyjrRgiLxmnaWPoB6lnU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id; s=default; bh=HZOs4I0sBHfaeZje0UX0md3DsNQ=; b=YDuBPgFIEdFLRSBj48hkF64efxvC G8ZenPLGgfrnLL/kZB19jWSwe0jNREkJ/px3kdAekSBeZA2npl1L0psgnPAXGWkV lQHYOkCH5oYcCtBZ5x60td1WUmFaFXA9x1GsdwerTWI61/IRycy8eTUSc2lBm09e G2HwRqNFr3i+X74= Received: (qmail 119505 invoked by alias); 25 Apr 2018 02:59:00 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 119482 invoked by uid 89); 25 Apr 2018 02:58:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy=gain, 30000, acquired, H*MI:wang X-HELO: mga04.intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 From: Kemi Wang To: Adhemerval Zanella , Glibc alpha Cc: Dave Hansen , Tim Chen , Andi Kleen , Ying Huang , Aaron Lu , Lu Aubrey , Kemi Wang Subject: [PATCH v2 1/3] Tunables: Add tunables of spin count for pthread adaptive spin mutex Date: Wed, 25 Apr 2018 10:56:26 +0800 Message-Id: <1524624988-29141-1-git-send-email-kemi.wang@intel.com> This patch does not have any functionality change, we only provide a spin count tunes for pthread adaptive spin mutex. The tunable glibc.mutex.spin_count tunes can be used by system administrator to squeeze system performance according to different hardware capability and workload model. This is the preparation work for the next patch, in which the way of adaptive spin would be changed from an expensive cmpxchg to read while spinning. * elf/dl-tunables.list: Add glibc.mutex.spin_count entry. * manual/tunables.texi: Add glibc.mutex.spin_count description. * nptl/Makefile: Add pthread_mutex_conf.c for compilation. * nptl/pthread_mutex_conf.h: New file. * nptl/pthread_mutex_conf.c: New file. ChangeLog: 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) Suggested-by: Andi Kleen Signed-off-by: Kemi Wang --- ChangeLog | 8 +++++ elf/dl-tunables.list | 9 ++++++ manual/tunables.texi | 21 +++++++++++++ nptl/Makefile | 3 +- nptl/pthread_mutex_conf.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ nptl/pthread_mutex_conf.h | 31 +++++++++++++++++++ 6 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 nptl/pthread_mutex_conf.c create mode 100644 nptl/pthread_mutex_conf.h diff --git a/ChangeLog b/ChangeLog index efa8d39..4750b11 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2018-04-24 Kemi Wang + + * elf/dl-tunables.list: Add glibc.mutex.spin_count entry. + * manual/tunables.texi: Add glibc.mutex.spin_count description. + * nptl/Makefile: Add pthread_mutex_conf.c for compilation. + * nptl/pthread_mutex_conf.h: New file. + * nptl/pthread_mutex_conf.c: New file. + 2018-04-24 Joseph Myers * sysdeps/mach/hurd/dl-sysdep.c: Include . diff --git a/elf/dl-tunables.list b/elf/dl-tunables.list index 1f8ecb8..dc1e8f4 100644 --- a/elf/dl-tunables.list +++ b/elf/dl-tunables.list @@ -121,4 +121,13 @@ glibc { default: 3 } } + + mutex { + spin_count { + type: INT_32 + minval: 0 + maxval: 30000 + default: 1000 + } + } } diff --git a/manual/tunables.texi b/manual/tunables.texi index be33c9f..c2cf8c6 100644 --- a/manual/tunables.texi +++ b/manual/tunables.texi @@ -281,6 +281,27 @@ of try lock attempts. The default value of this tunable is @samp{3}. @end deftp +@node Pthread Mutex Tunables +@section Pthread Mutex Tunables +@cindex pthread mutex tunables + +@deftp {Tunable namespace} glibc.mutex +Behavior of pthread mutex can be tuned to gain performance improvement +according to specific hardware capability and workload character by setting +the following tunables in the @code{mutex} namespace. +@end deftp + +@deftp Tunable glibc.mutex.spin_count +The @code{glibc.mutex.spin_count} tunable sets the maximum spin times that +a thread should spin on the lock before calling into the kernel to block. +Adaptive spin is used for the mutex initialized with PTHREAD_MUTEX_ADAPTIVE_NP +GNU extension. It affects both pthread_mutex_lock and pthread_mutex_timedlock. +The spinning is done in case of either the maximum spin times is reached or +the lock is acquired during spinning. + +The default value of this tunable is @samp{1000}. +@end deftp + @node Hardware Capability Tunables @section Hardware Capability Tunables @cindex hardware capability tunables diff --git a/nptl/Makefile b/nptl/Makefile index 94be92c..bd1096f 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -139,7 +139,8 @@ libpthread-routines = nptl-init 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/pthread_mutex_conf.c b/nptl/pthread_mutex_conf.c new file mode 100644 index 0000000..6340b5d --- /dev/null +++ b/nptl/pthread_mutex_conf.c @@ -0,0 +1,77 @@ +/* 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 + . */ + +#include "config.h" +#include +#include +#include +#include + +#if HAVE_TUNABLES +# define TUNABLE_NAMESPACE mutex +#endif +#include + + +struct mutex_config __mutex_aconf = + { + /* The maximum times a thread spin on the lock before going to block */ + .spin_count = 1000, + }; + +#if HAVE_TUNABLES +# define TUNABLE_CALLBACK_FNDECL(__name, __type) \ +static inline void \ +__always_inline \ +do_set_mutex_ ## __name (__type value) \ +{ \ + __mutex_aconf.__name = value; \ +} \ +void \ +TUNABLE_CALLBACK (set_mutex_ ## __name) (tunable_val_t *valp) \ +{ \ + __type value = (__type) (valp)->numval; \ + do_set_mutex_ ## __name (value); \ +} + +TUNABLE_CALLBACK_FNDECL (spin_count, int32_t); +#endif + +static void +mutex_tunables_init (int argc __attribute__ ((unused)), + char **argv __attribute__ ((unused)), + char **environ) +{ +#if HAVE_TUNABLES + + TUNABLE_GET (spin_count, int32_t, + TUNABLE_CALLBACK (set_mutex_spin_count)); +#endif +} + +#ifdef SHARED +# define INIT_SECTION ".init_array" +#else +# define INIT_SECTION ".preinit_array" +#endif + +void (*const __pthread_mutex_tunables_init_array []) (int, char **, char **) + __attribute__ ((section (INIT_SECTION), aligned (sizeof (void *)))) = +{ + &mutex_tunables_init +}; diff --git a/nptl/pthread_mutex_conf.h b/nptl/pthread_mutex_conf.h new file mode 100644 index 0000000..e5b027c --- /dev/null +++ b/nptl/pthread_mutex_conf.h @@ -0,0 +1,31 @@ +/* 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 + . */ +#ifndef _PTHREAD_MUTEX_CONF_H +#define _PTHREAD_MUTEX_CONF_H 1 + +#include +#include + +struct mutex_config +{ + int spin_count; +}; + +extern struct mutex_config __mutex_aconf attribute_hidden; + +#endif