From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by sourceware.org (Postfix) with ESMTPS id B5C313858D1E for ; Wed, 19 Apr 2023 01:17:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B5C313858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x630.google.com with SMTP id fw30so24928172ejc.5 for ; Tue, 18 Apr 2023 18:17:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1681867048; x=1684459048; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=wlsnY6I6iXbtZs/rnMrhVJlEOpEOn/hglRk+4OB3BKs=; b=WlXDB5JtmaN0fIdwS+JdXnva98kYZdiMkcgE6HZl9vF/M5siFgxCDpoiWg2RLCOlAL DkSk5vrrwhwbN+UgG21PVGesYlbgY56FGlU7qmPdfB6SNFFmwXrm0Mb4Jl/a770S6XfO C8s4sD2i0ojjKeh7bGowpvxX1mDKsuOqyZK1U6gK3Ia1rVCSPJZMTBCk0zYitUJaXGVs 3FjDCNwoWIXpH5QP0yQrhKo93BUR5VDtSd/U6EPJPr6rwtsGhmShE65pHAcrmmq1pKD3 dqHkzSk0bpuSGQLlRPbBRJ+RqXI96Rq/5U7Vi3L3XcZhIHgjzumrnVpayHRqP5eJhtm7 ppuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681867048; x=1684459048; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=wlsnY6I6iXbtZs/rnMrhVJlEOpEOn/hglRk+4OB3BKs=; b=OtLgCvuS+hLALrcaz6rGgynHKS4SmXjx/2oq9949/b6wM8EDrCBrdsryMcIyl2qM4a tfYwpBhc3p3Be/88Ql+Ekhqg6xEn7/7NCZamPCUQgZyf29v2LCpGmHVnB+Di77EiLvHZ zgzKcea7HxE38vH4Mt9PDyWCNigWfi1pM8K2I2hrt8UBQmqynEqmAX3qX0vpWLF8tPUz gA2nNE5GenhziKQxvhib/KgmTUfJ44F0+eoJu2md7fI1OKHrw8OjerdKWgqmUtM2nFWm fyMlFrn6MBEjr2dCHc61K9RFJwaRgbCLh4gizNszpW0frM3dmq3lWW4eV1osvIHezVpK H7Sw== X-Gm-Message-State: AAQBX9eWU4+C1xYvxsIf9U8yLukCnj6BW/s8JGke1uZJCtwX4NAp7nTL Jg6pfzlDKZPLI/oe0rrf/kzkxQlWdsk= X-Google-Smtp-Source: AKy350ZRoXP99eqmmXArLlCOj0+5qJlEZUKFVUo4yksjn/NaOQfjLUJrcRRn/EwuIE7Xc8B/Gbp5QA== X-Received: by 2002:a17:906:3454:b0:94e:e859:7b07 with SMTP id d20-20020a170906345400b0094ee8597b07mr15380473ejb.32.1681867048339; Tue, 18 Apr 2023 18:17:28 -0700 (PDT) Received: from noahgold-desk.intel.com ([2600:1010:b044:5553:786d:a5bb:b72b:86f8]) by smtp.gmail.com with ESMTPSA id q17-20020a1709066ad100b0094f6f45b2c1sm3924713ejs.156.2023.04.18.18.17.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Apr 2023 18:17:28 -0700 (PDT) From: Noah Goldstein To: libc-alpha@sourceware.org Cc: goldstein.w.n@gmail.com, hjl.tools@gmail.com, carlos@systemhalted.org Subject: [PATCH v1] nptl: Add single-threaded optimization to ADAPTIVE_NP mutex Date: Tue, 18 Apr 2023 20:17:22 -0500 Message-Id: <20230419011722.1154501-1-goldstein.w.n@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: ADAPTIVED_NP mutex is generally the most performant mutex option and is commonly used so it seems preferable for it to also benefit from the optimization. make check passes on linux-x86_64 --- nptl/pthread_mutex_cond_lock.c | 1 + nptl/pthread_mutex_lock.c | 40 ++++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/nptl/pthread_mutex_cond_lock.c b/nptl/pthread_mutex_cond_lock.c index f3af514305..fcc90bb16c 100644 --- a/nptl/pthread_mutex_cond_lock.c +++ b/nptl/pthread_mutex_cond_lock.c @@ -3,6 +3,7 @@ #define LLL_MUTEX_LOCK(mutex) \ lll_cond_lock ((mutex)->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex)) #define LLL_MUTEX_LOCK_OPTIMIZED(mutex) LLL_MUTEX_LOCK (mutex) +#define LLL_MUTEX_TRYLOCK_OPTIMIZED(mutex) LLL_MUTEX_TRYLOCK (mutex) /* Not actually elided so far. Needed? */ #define LLL_MUTEX_LOCK_ELISION(mutex) \ diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c index d4f96c70ef..011bd7488d 100644 --- a/nptl/pthread_mutex_lock.c +++ b/nptl/pthread_mutex_lock.c @@ -30,9 +30,9 @@ /* Some of the following definitions differ when pthread_mutex_cond_lock.c includes this file. */ #ifndef LLL_MUTEX_LOCK -/* lll_lock with single-thread optimization. */ -static inline void -lll_mutex_lock_optimized (pthread_mutex_t *mutex) + +static inline int +lll_mutex_try_singlethreaded_opt (pthread_mutex_t *mutex, int private) { /* The single-threaded optimization is only valid for private mutexes. For process-shared mutexes, the mutex could be in a @@ -41,16 +41,38 @@ lll_mutex_lock_optimized (pthread_mutex_t *mutex) acquired, POSIX requires that pthread_mutex_lock deadlocks for normal mutexes, so skip the optimization in that case as well. */ - int private = PTHREAD_MUTEX_PSHARED (mutex); if (private == LLL_PRIVATE && SINGLE_THREAD_P && mutex->__data.__lock == 0) - mutex->__data.__lock = 1; - else + { + mutex->__data.__lock = 1; + return 0; + } + return 1; +} + +/* lll_trylock with single-thread optimization. */ +static inline int +lll_mutex_trylock_optimized (pthread_mutex_t *mutex) +{ + if (lll_mutex_try_singlethreaded_opt (mutex, PTHREAD_MUTEX_PSHARED (mutex)) + == 0) + return 0; + return lll_trylock (mutex->__data.__lock); +} + +/* lll_lock with single-thread optimization. */ +static inline void +lll_mutex_lock_optimized (pthread_mutex_t *mutex) +{ + int private = PTHREAD_MUTEX_PSHARED (mutex); + if (lll_mutex_try_singlethreaded_opt (mutex, private)) lll_lock (mutex->__data.__lock, private); } # define LLL_MUTEX_LOCK(mutex) \ lll_lock ((mutex)->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex)) # define LLL_MUTEX_LOCK_OPTIMIZED(mutex) lll_mutex_lock_optimized (mutex) +# define LLL_MUTEX_TRYLOCK_OPTIMIZED(mutex) \ + lll_mutex_trylock_optimized (mutex) # define LLL_MUTEX_TRYLOCK(mutex) \ lll_trylock ((mutex)->__data.__lock) # define LLL_ROBUST_MUTEX_LOCK_MODIFIER 0 @@ -133,11 +155,11 @@ PTHREAD_MUTEX_LOCK (pthread_mutex_t *mutex) else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex) == PTHREAD_MUTEX_ADAPTIVE_NP, 1)) { - if (LLL_MUTEX_TRYLOCK (mutex) != 0) + if (LLL_MUTEX_TRYLOCK_OPTIMIZED (mutex) != 0) { int cnt = 0; - int max_cnt = MIN (max_adaptive_count (), - mutex->__data.__spins * 2 + 10); + int max_cnt + = MIN (max_adaptive_count (), mutex->__data.__spins * 2 + 10); int spin_count, exp_backoff = 1; unsigned int jitter = get_jitter (); do -- 2.34.1