]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
glibc: nptl Use a single loop in pthread_cond_wait instaed of a nested loop
authorSunil Dora <sunilkumar.dora@windriver.com>
Tue, 17 Jun 2025 10:08:52 +0000 (03:08 -0700)
committerSteve Sakoman <steve@sakoman.com>
Tue, 17 Jun 2025 15:05:29 +0000 (08:05 -0700)
The following commits have been cherry-picked from Glibc master branch:
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847

Upstream-Status: Backport
[https://sourceware.org/git/?p=glibc.git;a=commit;h=929a4764ac90382616b6a21f099192b2475da674]

Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
Signed-off-by: Steve Sakoman <steve@sakoman.com>
meta/recipes-core/glibc/glibc/0026-PR25847-5.patch [new file with mode: 0644]
meta/recipes-core/glibc/glibc_2.35.bb

diff --git a/meta/recipes-core/glibc/glibc/0026-PR25847-5.patch b/meta/recipes-core/glibc/glibc/0026-PR25847-5.patch
new file mode 100644 (file)
index 0000000..16fe6f8
--- /dev/null
@@ -0,0 +1,105 @@
+From d9ffb50dc55f77e584a5d0275eea758c7a6b04e3 Mon Sep 17 00:00:00 2001
+From: Malte Skarupke <malteskarupke@fastmail.fm>
+Date: Mon, 16 Jun 2025 23:53:35 -0700
+Subject: [PATCH] nptl: Use a single loop in pthread_cond_wait instaed of a
+ nested loop
+
+The loop was a little more complicated than necessary. There was only one
+break statement out of the inner loop, and the outer loop was nearly empty.
+So just remove the outer loop, moving its code to the one break statement in
+the inner loop. This allows us to replace all gotos with break statements.
+
+The following commits have been cherry-picked from Glibc master branch:
+Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
+
+Upstream-Status: Backport
+[https://sourceware.org/git/?p=glibc.git;a=commit;h=929a4764ac90382616b6a21f099192b2475da674]
+
+Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
+---
+ nptl/pthread_cond_wait.c | 41 +++++++++++++++++++---------------------
+ 1 file changed, 19 insertions(+), 22 deletions(-)
+
+diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
+index 47e834cade..5c86880105 100644
+--- a/nptl/pthread_cond_wait.c
++++ b/nptl/pthread_cond_wait.c
+@@ -410,17 +410,15 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
+       return err;
+     }
+-  /* Now wait until a signal is available in our group or it is closed.
+-     Acquire MO so that if we observe (signals == lowseq) after group
+-     switching in __condvar_quiesce_and_switch_g1, we synchronize with that
+-     store and will see the prior update of __g1_start done while switching
+-     groups too.  */
+-  unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
+-
+-  do
+-    {
++
+       while (1)
+       {
++        /* Now wait until a signal is available in our group or it is closed.
++           Acquire MO so that if we observe (signals == lowseq) after group
++           switching in __condvar_quiesce_and_switch_g1, we synchronize with that
++           store and will see the prior update of __g1_start done while switching
++           groups too.  */
++        unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
+         uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
+         unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
+@@ -429,7 +427,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
+             /* If the group is closed already,
+                then this waiter originally had enough extra signals to
+                consume, up until the time its group was closed.  */
+-             goto done;
++             break;
+           }
+         /* If there is an available signal, don't block.
+@@ -438,8 +436,16 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
+            G2, but in either case we're allowed to consume the available
+            signal and should not block anymore.  */
+         if ((int)(signals - lowseq) >= 2)
+-          break;
+-
++           {
++             /* Try to grab a signal.  See above for MO.  (if we do another loop
++                iteration we need to see the correct value of g1_start)  */
++                     if (atomic_compare_exchange_weak_acquire (
++                               cond->__data.__g_signals + g,
++                       &signals, signals - 2))
++                       break;
++                     else
++                       continue;
++           }
+         /* No signals available after spinning, so prepare to block.
+            We first acquire a group reference and use acquire MO for that so
+            that we synchronize with the dummy read-modify-write in
+@@ -479,21 +485,12 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
+                the lock during cancellation is not possible.  */
+             __condvar_cancel_waiting (cond, seq, g, private);
+             result = err;
+-            goto done;
++            break;
+           }
+         else
+           __condvar_dec_grefs (cond, g, private);
+-        /* Reload signals.  See above for MO.  */
+-        signals = atomic_load_acquire (cond->__data.__g_signals + g);
+       }
+-    }
+-  /* Try to grab a signal.  See above for MO.  (if we do another loop
+-     iteration we need to see the correct value of g1_start)  */
+-  while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g,
+-                                              &signals, signals - 2));
+-
+- done:
+   /* Confirm that we have been woken.  We do that before acquiring the mutex
+      to allow for execution of pthread_cond_destroy while having acquired the
+-- 
+2.49.0
+
index bb5d22cfe8cbd8bda41f646c2e609d2f72aa83f1..04dcb22c3d97ae63617eeab981b6aeed1a16dfc9 100644 (file)
@@ -66,6 +66,7 @@ SRC_URI =  "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
            file://0026-PR25847-2.patch \
            file://0026-PR25847-3.patch \
            file://0026-PR25847-4.patch \
+           file://0026-PR25847-5.patch \
            \
            file://0001-Revert-Linux-Implement-a-useful-version-of-_startup_.patch \
            file://0002-get_nscd_addresses-Fix-subscript-typos-BZ-29605.patch \