glibc/support
Carlos O'Donell 86013ef5ce 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)
2019-01-31 21:37:53 -05:00
..
Makefile nptl: Fix pthread_rwlock_try*lock stalls (Bug 23844) 2019-01-31 21:37:53 -05: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
blob_repeat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
blob_repeat.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
capture_subprocess.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
check.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
check.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
check_addrinfo.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
check_dns_packet.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
check_hostent.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
check_netent.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
check_nss.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
delayed_exit.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
descriptors.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
echo-container.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
format_nss.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
ignore_stderr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
links-dso-program-c.c Add test-in-container infrastructure. 2018-08-22 21:20:37 -04:00
links-dso-program.cc Add test-in-container infrastructure. 2018-08-22 21:20:37 -04:00
namespace.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
next_to_fault.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
next_to_fault.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
oom_error.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
resolv_test.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
resolv_test.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
run_diff.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
set_fortify_handler.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
shell-container.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support-xfstat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support-xstat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_become_root.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_can_chroot.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_capture_subprocess.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_capture_subprocess_check.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_chroot.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_copy_file_range.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_descriptor_supports_holes.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_descriptors.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_enter_mount_namespace.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_enter_network_namespace.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_format_address_family.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_format_addrinfo.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_format_dns_packet.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_format_herrno.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_format_hostent.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_format_netent.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_isolate_in_subprocess.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_openpty.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_paths.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_quote_blob.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_quote_string.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_record_failure.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_run_diff.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_shared_allocate.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_test_compare_blob.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_test_compare_failure.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_test_compare_string.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_test_main.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_test_verify_impl.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
support_write_file_string.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
temp_file-internal.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
temp_file.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
temp_file.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-container.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-driver.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-driver.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
true-container.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support-namespace.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_blob_repeat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_capture_subprocess.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_descriptors.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_format_dns_packet.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_quote_blob.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_quote_string.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_record_failure-2.sh Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-support_record_failure.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-test_compare.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-test_compare_blob.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-test_compare_string.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-xreadlink.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-xsigstack.c Tests for minimal signal handler functionality in MINSIGSTKSZ space. 2019-01-16 09:04:10 -05:00
tty.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
write_message.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xaccept.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xaccept4.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xasprintf.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xbind.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xcalloc.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xchroot.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xclose.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xconnect.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xcopy_file_range.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xdlfcn.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xdlfcn.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xdup2.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xfclose.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xfopen.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xfork.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xftruncate.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xgetsockname.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xlisten.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xlseek.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmalloc.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmemstream.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmemstream.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmkdir.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmkdirp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmmap.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmprotect.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xmunmap.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xopen.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpipe.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpoll.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_attr_destroy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_attr_init.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_attr_setdetachstate.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_attr_setguardsize.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_attr_setstacksize.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_barrier_destroy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_barrier_init.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_barrier_wait.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_barrierattr_destroy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_barrierattr_init.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_barrierattr_setpshared.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_cancel.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_check_return.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_cond_wait.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_create.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_detach.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_join.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutex_consistent.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutex_destroy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutex_init.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutex_lock.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutex_unlock.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutexattr_destroy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutexattr_init.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutexattr_setprotocol.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutexattr_setpshared.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutexattr_setrobust.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_mutexattr_settype.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_once.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_rwlock_destroy.c nptl: Fix pthread_rwlock_try*lock stalls (Bug 23844) 2019-01-31 21:37:53 -05:00
xpthread_rwlock_init.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_rwlock_rdlock.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_rwlock_unlock.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_rwlock_wrlock.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_rwlockattr_init.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_rwlockattr_setkind_np.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_sigmask.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_spin_lock.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpthread_spin_unlock.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xraise.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xreadlink.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xrealloc.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xrecvfrom.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsendto.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsetsockopt.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsigaction.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsignal.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsignal.h Tests for minimal signal handler functionality in MINSIGSTKSZ space. 2019-01-16 09:04:10 -05:00
xsigstack.c hurd: Fix libsupport xsigstack build 2019-01-24 09:38:49 -02:00
xsocket.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsocket.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xstdio.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xstrdup.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xstrndup.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsymlink.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xsysconf.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xthread.h nptl: Fix pthread_rwlock_try*lock stalls (Bug 23844) 2019-01-31 21:37:53 -05:00
xunistd.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xunlink.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xwaitpid.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xwrite.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00

README

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