From: Sunil K Pandey Date: Tue, 9 Dec 2025 16:57:44 +0000 (-0800) Subject: nptl: Optimize trylock for high cache contention workloads (BZ #33704) X-Git-Tag: glibc-2.43~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63716823dbad9482e09972907ae98e9cb00f9b86;p=thirdparty%2Fglibc.git nptl: Optimize trylock for high cache contention workloads (BZ #33704) Check lock availability before acquisition to reduce cache line bouncing. Significantly improves trylock throughput on multi-core systems under heavy contention. Tested on x86_64. Fixes BZ #33704. Co-authored-by: Alex M Wells Reviewed-by: Wilco Dijkstra --- diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c index 94621cc254..fe9ba8da67 100644 --- a/nptl/pthread_mutex_trylock.c +++ b/nptl/pthread_mutex_trylock.c @@ -47,7 +47,8 @@ ___pthread_mutex_trylock (pthread_mutex_t *mutex) return 0; } - if (lll_trylock (mutex->__data.__lock) == 0) + if (atomic_load_relaxed (&(mutex->__data.__lock)) == 0 + && lll_trylock (mutex->__data.__lock) == 0) { /* Record the ownership. */ mutex->__data.__owner = id; @@ -60,7 +61,10 @@ ___pthread_mutex_trylock (pthread_mutex_t *mutex) case PTHREAD_MUTEX_TIMED_NP: case PTHREAD_MUTEX_ADAPTIVE_NP: case PTHREAD_MUTEX_ERRORCHECK_NP: - if (lll_trylock (mutex->__data.__lock) != 0) + /* Mutex type is already loaded, lock check overhead should + be minimal. */ + if (atomic_load_relaxed (&(mutex->__data.__lock)) != 0 + || lll_trylock (mutex->__data.__lock) != 0) break; /* Record the ownership. */