glibc/support
Carlos O'Donell e8c13d5f7a 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 5fc9ed4c40)
2019-02-17 11:44:19 +01:00
..
blob_repeat.c support: Do not require overflow builtin in support/blob_repeat.c 2018-12-15 19:09:25 +01:00
blob_repeat.h stdlib/test-bz22786: Avoid spurious test failures using alias mappings 2018-11-02 10:47:16 +01:00
capture_subprocess.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
check_addrinfo.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
check_dns_packet.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
check_hostent.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
check_netent.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
check_nss.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
check.c support: Preserve errno in write_message, TEST_VERIFY and other checks 2018-01-12 13:35:01 +01:00
check.h support: Implement <support/descriptors.h> to track file descriptors 2018-12-12 12:04:10 +01:00
delayed_exit.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
descriptors.h support: Implement <support/descriptors.h> to track file descriptors 2018-12-12 12:04:10 +01:00
format_nss.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ignore_stderr.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
Makefile nptl: Fix pthread_rwlock_try*lock stalls (Bug 23844) 2019-02-17 11:44:19 +01:00
namespace.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
next_to_fault.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
next_to_fault.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
oom_error.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
README support: Introduce new subdirectory for test infrastructure 2016-12-09 08:18:27 +01:00
README-testing.c support: Introduce new subdirectory for test infrastructure 2016-12-09 08:18:27 +01:00
resolv_test.c resolv: Support binary labels in test framework 2018-01-08 20:07:24 +01:00
resolv_test.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
run_diff.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
set_fortify_handler.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_become_root.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_can_chroot.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_capture_subprocess_check.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_capture_subprocess.c support: Close original descriptors in support_capture_subprocess 2018-12-12 12:03:36 +01:00
support_chroot.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_descriptors.c support: Implement <support/descriptors.h> to track file descriptors 2018-12-12 12:04:10 +01:00
support_enter_mount_namespace.c support_enter_mount_namespace: Fix indentation 2018-01-04 15:11:41 +01:00
support_enter_network_namespace.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_format_address_family.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_format_addrinfo.c Switch IDNA implementation to libidn2 [BZ #19728] [BZ #19729] [BZ #22247] 2018-05-23 15:27:24 +02:00
support_format_dns_packet.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_format_herrno.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_format_hostent.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_format_netent.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_isolate_in_subprocess.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_openpty.c [BZ 1190] Make EOF sticky in stdio. 2018-03-13 08:31:56 -04:00
support_quote_blob.c support: Add TEST_COMPARE_BLOB, support_quote_blob 2018-05-16 17:00:36 +02:00
support_quote_string.c support: Implement support_quote_string 2018-12-12 12:03:26 +01:00
support_record_failure.c support: Implement <support/descriptors.h> to track file descriptors 2018-12-12 12:04:10 +01:00
support_run_diff.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_shared_allocate.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support_test_compare_blob.c support: Add TEST_COMPARE_BLOB, support_quote_blob 2018-05-16 17:00:36 +02:00
support_test_compare_failure.c support: Preserve errno in write_message, TEST_VERIFY and other checks 2018-01-12 13:35:01 +01:00
support_test_main.c support: Print timestamps in timeout handler 2018-11-19 15:42:03 +01:00
support_test_verify_impl.c support: Preserve errno in write_message, TEST_VERIFY and other checks 2018-01-12 13:35:01 +01:00
support_write_file_string.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support-xfstat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support-xstat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
support.h support_quote_string: Do not use str parameter name 2018-12-12 12:03:36 +01:00
temp_file-internal.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
temp_file.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
temp_file.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
test-driver.c support: Add TEST_NO_SETVBUF 2018-06-26 12:30:50 +02:00
test-driver.h support: Add TEST_NO_SETVBUF 2018-06-26 12:30:50 +02:00
tst-support_blob_repeat.c stdlib/test-bz22786: Avoid spurious test failures using alias mappings 2018-11-02 10:47:16 +01:00
tst-support_capture_subprocess.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-support_descriptors.c support: Implement <support/descriptors.h> to track file descriptors 2018-12-12 12:04:10 +01:00
tst-support_format_dns_packet.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-support_quote_blob.c support: Add TEST_COMPARE_BLOB, support_quote_blob 2018-05-16 17:00:36 +02:00
tst-support_quote_string.c support: Implement support_quote_string 2018-12-12 12:03:26 +01:00
tst-support_record_failure-2.sh Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-support_record_failure.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-support-namespace.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-test_compare_blob.c support: Add TEST_COMPARE_BLOB, support_quote_blob 2018-05-16 17:00:36 +02:00
tst-test_compare.c support: Increase usability of TEST_COMPARE 2018-01-08 20:07:24 +01:00
tst-xreadlink.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tty.h [BZ 1190] Make EOF sticky in stdio. 2018-03-13 08:31:56 -04:00
write_message.c support: Preserve errno in write_message, TEST_VERIFY and other checks 2018-01-12 13:35:01 +01:00
xaccept4.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xaccept.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xasprintf.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xbind.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xcalloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xchroot.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xclose.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xconnect.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xdlfcn.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xdlfcn.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xdup2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xfclose.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xfopen.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xfork.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xftruncate.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xgetsockname.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xlisten.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xlseek.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmalloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmemstream.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmemstream.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmkdir.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmmap.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmprotect.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmunmap.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xopen.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpipe.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpoll.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_attr_destroy.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_attr_init.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_attr_setdetachstate.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_attr_setguardsize.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_attr_setstacksize.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_barrier_destroy.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_barrier_init.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_barrier_wait.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_barrierattr_destroy.c support: Add wrappers for pthread_barrierattr_t 2018-05-29 15:37:00 +02:00
xpthread_barrierattr_init.c support: Add wrappers for pthread_barrierattr_t 2018-05-29 15:37:00 +02:00
xpthread_barrierattr_setpshared.c support: Add wrappers for pthread_barrierattr_t 2018-05-29 15:37:00 +02:00
xpthread_cancel.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_check_return.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_cond_wait.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_create.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_detach.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_join.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutex_consistent.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutex_destroy.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutex_init.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutex_lock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutex_unlock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutexattr_destroy.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutexattr_init.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutexattr_setprotocol.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutexattr_setpshared.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutexattr_setrobust.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_mutexattr_settype.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_once.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_rwlock_destroy.c nptl: Fix pthread_rwlock_try*lock stalls (Bug 23844) 2019-02-17 11:44:19 +01:00
xpthread_rwlock_init.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_rwlock_rdlock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_rwlock_unlock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_rwlock_wrlock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_rwlockattr_init.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_rwlockattr_setkind_np.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_sigmask.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_spin_lock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xpthread_spin_unlock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xraise.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xreadlink.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xrealloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xrecvfrom.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsendto.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsetsockopt.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsigaction.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsignal.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsignal.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsocket.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsocket.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xstdio.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xstrdup.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xstrndup.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xsysconf.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xthread.h nptl: Fix pthread_rwlock_try*lock stalls (Bug 23844) 2019-02-17 11:44:19 +01:00
xunistd.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xunlink.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xwaitpid.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xwrite.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00

This subdirectory contains infrastructure which is not put into
installed libraries, but may be linked into programs (installed or
not) and tests.

# Error-checking wrappers

These wrappers test for error return codes an terminate the process on
error.  They are declared in these header files:

* support.h
* xsignal.h
* xthread.h

In general, new wrappers should be added to support.h if possible.
However, support.h must remain fully compatible with C90 and therefore
cannot include headers which use identifers not reserved in C90.  If
the wrappers need additional types, additional headers such as
signal.h need to be introduced.

# Test framework

The test framework provides a main program for tests, including a
timeout for hanging tests.  See README-testing.c for a minimal
example, and test-driver.c for details how to use it.  The following
header files provide related declarations:

* check.h
* temp_file.h
* test-driver.h