[PATCH v3] nptl: Optimize trylock for high cache contention workloads (BZ #33704)
Yann Droneaud
yann@droneaud.fr
Tue Dec 16 22:59:19 GMT 2025
Hi,
Le 16/12/2025 à 03:21, Sunil K Pandey a écrit :
> Check lock availability before acquisition to reduce cache line
> bouncing. Significantly improves trylock throughput on multi-core
> systems under heavy contention.
>
> mutex trylock throughput benchmark runtime
>
> Core baseline patch
> ==== =============== =============
> 80 66Min 32Sec 45Sec
> 24 8Min 4Sec 14Sec
> 12 5Min 14Sec 34Sec
> 8 3Min 40Sec 20Sec
>
> Throughput data(Core count: 80)
>
> tcount baseline pthread_mutex_trylock Improvement
> ====== ======== ===================== ===========
> 80 232112 3119301 13.44x
> 64 247737 937424 3.78x
> 32 441441 888738 2.01x
> 16 863201 1529987 1.77x
> 8 1587950 2775892 1.75x
> 4 3208012 6487683 2.02x
> 2 7729917 11811184 1.53x
>
> Tested on x86_64.
Which one ?
Any results for other architectures ?
> Fixes BZ #33704.
>
> Add recursive.
> ---
> nptl/pthread_mutex_trylock.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> 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. */
as lll_trylock() is a macro, could the relaxed load be inserted into it,
providing the improvement to other user of lll_trylock() ?
Regards.
More information about the Libc-alpha
mailing list