This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCHv2] nptl: Fix pthread_rwlock_try*lock stalls [BZ #23844]
On 1/22/19 1:12 PM, Carlos O'Donell wrote:
> v2
> - Added analysis comment to tryrdlock test.
> - Removed rw var and avoided boolean coercion.
> - Avoided incomplete test output to stdout.
Siddhesh,
Both Torvald and Rik have OK'd my use of Signed-off-by.
Florian has done a review of tests.
Torvald, Rik and myself have reviewed and tested the fix.
Rik restated that the current fix I have here fixes his test case.
I plan to do a "quick" b-m-g run to look for issues and then push
this fix as my last fix for 2.29.
> From 0768c51e2930f922071b4b77f96bb15d1ddae004 Mon Sep 17 00:00:00 2001
> From: Carlos O'Donell <carlos@redhat.com>
> Date: Mon, 21 Jan 2019 22:50:12 -0500
> Subject: [PATCH] nptl: Fix pthread_rwlock_try*lock stalls (Bug 23844)
>
> For a full analysis of both the pthread_rwlock_tryrdlock() stall
> and the pthread_rwlock_trywrlock() stall see:
> https://sourceware.org/bugzilla/show_bug.cgi?id=23844#c14
>
> In the pthread_rwlock_trydlock() function we fail to inspect for
> PTHREAD_RWLOCK_FUTEX_USED in __wrphase_futex and wake the waiting
> readers.
>
> In the pthread_rwlock_trywrlock() function we write 1 to
> __wrphase_futex and loose the setting of the PTHREAD_RWLOCK_FUTEX_USED
> bit, again failing to wake waiting readers during unlock.
>
> The fix in the case of pthread_rwlock_trydlock() is to check for
> PTHREAD_RWLOCK_FUTEX_USED and wake the readers.
>
> The fix in the case of pthread_rwlock_trywrlock() is to only write
> 1 to __wrphase_futex if we installed the write phase, since all other
> readers would be spinning waiting for this step.
>
> We add two new tests, one exercises the stall for
> pthread_rwlock_trywrlock() which is easy to exercise, and one exercises
> the stall for pthread_rwlock_trydlock() which is harder to exercise.
>
> The pthread_rwlock_trywrlock() test fails consistently without the fix,
> and passes after. The pthread_rwlock_tryrdlock() test fails roughly
> 5-10% of the time without the fix, and passes all the time after.
>
> Signed-off-by: Carlos O'Donell <carlos@redhat.com>
> Signed-off-by: Torvald Riegel <triegel@redhat.com>
> Signed-off-by: Rik Prohaska <prohaska7@gmail.com>
--
Cheers,
Carlos.