[PATCH v2] nptl: Optimize trylock for high cache contention workloads (BZ #33704)

Pandey, Sunil K sunil.k.pandey@intel.com
Tue Dec 16 00:16:41 GMT 2025


Hi Wilco,

Yes, PTHREAD_MUTEX_RECURSIVE_NP should also benefit from this change since the logic is similar. I don't have a strong
 opinion on this, as we don't currently have any real-world test cases available for PTHREAD_MUTEX_RECURSIVE_NP.

I ran a quick check and found that it doesn't make any difference in code size on x86 - the changes are absorbed by
 alignment adjustments.

Please let me know if this change looks acceptable to you. If so, I can update it to v3.

Thanks,
Sunil

$ git diff origin/master
diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c
index 94621cc254..ae22b83400 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.  */






-----Original Message-----
From: Wilco Dijkstra <Wilco.Dijkstra@arm.com> 
Sent: Monday, December 15, 2025 1:25 PM
To: Pandey, Sunil K <sunil.k.pandey@intel.com>
Cc: GNU C Library <libc-alpha@sourceware.org>
Subject: [PATCH v2] nptl: Optimize trylock for high cache contention workloads (BZ #33704)

Hi Sunil,

This looks good to me. However is there a reason not to do the same for the PTHREAD_MUTEX_RECURSIVE_NP case? That uses the same lll_trylock approach (and it would be nice to use more similar logic for both cases).

Cheers,
Wilco


More information about the Libc-alpha mailing list