mirror of
https://git.yoctoproject.org/git/poky
synced 2026-01-01 13:58:04 +00:00
glibc: nptl Remove unnecessary quadruple check in pthread_cond_wait
The following commits have been cherry-picked from Glibc master branch: Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847 [1] https://sourceware.org/git/?p=glibc.git;a=commit;h=4f7b051f8ee3feff1b53b27a906f245afaa9cee1 [2] https://sourceware.org/pipermail/libc-stable/2025-July/002276.html (From OE-Core rev: e6cac5aef751d698327f6ebee966462644c6c6a8) Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com> Signed-off-by: Steve Sakoman <steve@sakoman.com>
This commit is contained in:
parent
7b6bc5b49c
commit
2fdbec72e5
118
meta/recipes-core/glibc/glibc/0026-PR25847-4.patch
Normal file
118
meta/recipes-core/glibc/glibc/0026-PR25847-4.patch
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
From d714165c8bb3cac420077cfa61e3df87ea7f8b2c Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Tue, 14 Oct 2025 05:34:06 -0700
|
||||
Subject: [PATCH] nptl: Remove unnecessary quadruple check in pthread_cond_wait
|
||||
|
||||
pthread_cond_wait was checking whether it was in a closed group no less than
|
||||
four times. Checking once is enough. Here are the four checks:
|
||||
|
||||
1. While spin-waiting. This was dead code: maxspin is set to 0 and has been
|
||||
for years.
|
||||
2. Before deciding to go to sleep, and before incrementing grefs: I kept this
|
||||
3. After incrementing grefs. There is no reason to think that the group would
|
||||
close while we do an atomic increment. Obviously it could close at any
|
||||
point, but that doesn't mean we have to recheck after every step. This
|
||||
check was equally good as check 2, except it has to do more work.
|
||||
4. When we find ourselves in a group that has a signal. We only get here after
|
||||
we check that we're not in a closed group. There is no need to check again.
|
||||
The check would only have helped in cases where the compare_exchange in the
|
||||
next line would also have failed. Relying on the compare_exchange is fine.
|
||||
|
||||
Removing the duplicate checks clarifies the code.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
commit: 4f7b051f8ee3feff1b53b27a906f245afaa9cee1
|
||||
|
||||
Upstream-Status: Submitted
|
||||
[https://sourceware.org/pipermail/libc-stable/2025-July/002276.html]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_wait.c | 49 ----------------------------------------
|
||||
1 file changed, 49 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index cee19687..47e834ca 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -366,7 +366,6 @@ static __always_inline int
|
||||
__pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
clockid_t clockid, const struct __timespec64 *abstime)
|
||||
{
|
||||
- const int maxspin = 0;
|
||||
int err;
|
||||
int result = 0;
|
||||
|
||||
@@ -425,33 +424,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
|
||||
- /* Spin-wait first.
|
||||
- Note that spinning first without checking whether a timeout
|
||||
- passed might lead to what looks like a spurious wake-up even
|
||||
- though we should return ETIMEDOUT (e.g., if the caller provides
|
||||
- an absolute timeout that is clearly in the past). However,
|
||||
- (1) spurious wake-ups are allowed, (2) it seems unlikely that a
|
||||
- user will (ab)use pthread_cond_wait as a check for whether a
|
||||
- point in time is in the past, and (3) spinning first without
|
||||
- having to compare against the current time seems to be the right
|
||||
- choice from a performance perspective for most use cases. */
|
||||
- unsigned int spin = maxspin;
|
||||
- while (spin > 0 && ((int)(signals - lowseq) < 2))
|
||||
- {
|
||||
- /* Check that we are not spinning on a group that's already
|
||||
- closed. */
|
||||
- if (seq < (g1_start >> 1))
|
||||
- break;
|
||||
-
|
||||
- /* TODO Back off. */
|
||||
-
|
||||
- /* Reload signals. See above for MO. */
|
||||
- signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
- g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
- spin--;
|
||||
- }
|
||||
-
|
||||
if (seq < (g1_start >> 1))
|
||||
{
|
||||
/* If the group is closed already,
|
||||
@@ -482,24 +454,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
an atomic read-modify-write operation and thus extend the release
|
||||
sequence. */
|
||||
atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2);
|
||||
- signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
- g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
-
|
||||
- if (seq < (g1_start >> 1))
|
||||
- {
|
||||
- /* group is closed already, so don't block */
|
||||
- __condvar_dec_grefs (cond, g, private);
|
||||
- goto done;
|
||||
- }
|
||||
-
|
||||
- if ((int)(signals - lowseq) >= 2)
|
||||
- {
|
||||
- /* a signal showed up or G1/G2 switched after we grabbed the
|
||||
- refcount */
|
||||
- __condvar_dec_grefs (cond, g, private);
|
||||
- break;
|
||||
- }
|
||||
|
||||
// Now block.
|
||||
struct _pthread_cleanup_buffer buffer;
|
||||
@@ -533,9 +487,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
/* Reload signals. See above for MO. */
|
||||
signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
}
|
||||
-
|
||||
- if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))
|
||||
- goto done;
|
||||
}
|
||||
/* 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) */
|
||||
--
|
||||
2.49.0
|
||||
|
||||
|
|
@ -65,6 +65,7 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
|
|||
file://0026-PR25847-1.patch \
|
||||
file://0026-PR25847-2.patch \
|
||||
file://0026-PR25847-3.patch \
|
||||
file://0026-PR25847-4.patch \
|
||||
\
|
||||
file://0001-Revert-Linux-Implement-a-useful-version-of-_startup_.patch \
|
||||
file://0002-get_nscd_addresses-Fix-subscript-typos-BZ-29605.patch \
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user