[Bug nptl/23844] pthread_rwlock_trywrlock results in hang
cvs-commit at gcc dot gnu.org
sourceware-bugzilla@sourceware.org
Fri Feb 1 03:06:00 GMT 2019
https://sourceware.org/bugzilla/show_bug.cgi?id=23844
--- Comment #19 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, release/2.29/master has been updated
via 86013ef5cea322b8f4b9c22f230c22cce369e947 (commit)
from 56c86f5dd516284558e106d04b92875d5b623b7a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=86013ef5cea322b8f4b9c22f230c22cce369e947
commit 86013ef5cea322b8f4b9c22f230c22cce369e947
Author: Carlos O'Donell <carlos@redhat.com>
Date: Mon Jan 21 22:50:12 2019 -0500
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>
Co-authored-by: Torvald Riegel <triegel@redhat.com>
Co-authored-by: Rik Prohaska <prohaska7@gmail.com>
(cherry picked from commit 5fc9ed4c4058bfbdf51ad6e7aac7d209b580e8c4)
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 17 ++
nptl/Makefile | 3 +-
nptl/pthread_rwlock_tryrdlock.c | 25 ++-
nptl/pthread_rwlock_trywrlock.c | 9 +-
nptl/tst-rwlock-tryrdlock-stall.c | 355 +++++++++++++++++++++++++++++++++++++
nptl/tst-rwlock-trywrlock-stall.c | 108 +++++++++++
support/Makefile | 1 +
support/xpthread_rwlock_destroy.c | 26 +++
support/xthread.h | 1 +
9 files changed, 534 insertions(+), 11 deletions(-)
create mode 100644 nptl/tst-rwlock-tryrdlock-stall.c
create mode 100644 nptl/tst-rwlock-trywrlock-stall.c
create mode 100644 support/xpthread_rwlock_destroy.c
--
You are receiving this mail because:
You are on the CC list for the bug.
More information about the Glibc-bugs
mailing list