glibc/nptl
Stefan Liebler 403b4feb22 Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275]
The race leads either to pthread_mutex_destroy returning EBUSY
or triggering an assertion (See description in bugzilla).

This patch is fixing the race by ensuring that the elision path is
used in all cases if elision is enabled by the GLIBC_TUNABLES framework.

The __kind variable in struct __pthread_mutex_s is accessed concurrently.
Therefore we are now using the atomic macros.

The new testcase tst-mutex10 is triggering the race on s390x and intel.
Presumably also on power, but I don't have access to a power machine
with lock-elision. At least the code for power is the same as on the other
two architectures.

ChangeLog:

	[BZ #23275]
	* nptl/tst-mutex10.c: New File.
	* nptl/Makefile (tests): Add tst-mutex10.
	(tst-mutex10-ENV): New variable.
	* sysdeps/unix/sysv/linux/s390/force-elision.h: (FORCE_ELISION):
	Ensure that elision path is used if elision is available.
	* sysdeps/unix/sysv/linux/powerpc/force-elision.h (FORCE_ELISION):
	Likewise.
	* sysdeps/unix/sysv/linux/x86/force-elision.h: (FORCE_ELISION):
	Likewise.
	* nptl/pthreadP.h (PTHREAD_MUTEX_TYPE, PTHREAD_MUTEX_TYPE_ELISION)
	(PTHREAD_MUTEX_PSHARED): Use atomic_load_relaxed.
	* nptl/pthread_mutex_consistent.c (pthread_mutex_consistent): Likewise.
	* nptl/pthread_mutex_getprioceiling.c (pthread_mutex_getprioceiling):
	Likewise.
	* nptl/pthread_mutex_lock.c (__pthread_mutex_lock_full)
	(__pthread_mutex_cond_lock_adjust): Likewise.
	* nptl/pthread_mutex_setprioceiling.c (pthread_mutex_setprioceiling):
	Likewise.
	* nptl/pthread_mutex_timedlock.c (__pthread_mutex_timedlock): Likewise.
	* nptl/pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise.
	* nptl/pthread_mutex_unlock.c (__pthread_mutex_unlock_full): Likewise.
	* sysdeps/nptl/bits/thread-shared-types.h (struct __pthread_mutex_s):
	Add comments.
	* nptl/pthread_mutex_destroy.c (__pthread_mutex_destroy):
	Use atomic_load_relaxed and atomic_store_relaxed.
	* nptl/pthread_mutex_init.c (__pthread_mutex_init):
	Use atomic_store_relaxed.
2018-10-17 12:23:04 +02:00
..
DESIGN-systemtap-probes.txt
Makefile Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
TODO
TODO-kernel
TODO-testing
Versions
alloca_cutoff.c
allocatestack.c
call_once.c
cancellation.c
cleanup.c
cleanup_compat.c
cleanup_defer.c
cleanup_defer_compat.c
cleanup_routine.c
cnd_broadcast.c
cnd_destroy.c
cnd_init.c
cnd_signal.c
cnd_timedwait.c
cnd_wait.c
compat-pthread_self.c
cond-perf.c
createthread.c
default-sched.h
descr.h
eintr.c
elision-conf.h
errno-loc.c
events.c
forward.c
herrno.c
libc-cancellation.c
libc-cleanup.c
libc-lowlevellock.c
libc_multiple_threads.c
libc_pthread_init.c
lll_timedlock_wait.c
lll_timedwait_tid.c
lowlevellock.c
mtx_destroy.c
mtx_init.c
mtx_lock.c
mtx_timedlock.c
mtx_trylock.c
mtx_unlock.c
nptl-init.c
nptl-printers.py
nptl_lock_constants.pysym
nptlfreeres.c
old_pthread_atfork.c
old_pthread_cond_broadcast.c
old_pthread_cond_destroy.c
old_pthread_cond_init.c
old_pthread_cond_signal.c
old_pthread_cond_timedwait.c
old_pthread_cond_wait.c
perf.c
pt-allocrtsig.c
pt-cleanup.c
pt-crti.S
pt-fork.c
pt-interp.c
pt-longjmp.c
pt-raise.c
pt-system.c
pt-vfork.c
pthread-errnos.sym
pthread-pi-defines.sym
pthread-pids.h
pthreadP.h Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_atfork.c
pthread_attr_destroy.c
pthread_attr_getaffinity.c
pthread_attr_getdetachstate.c
pthread_attr_getguardsize.c
pthread_attr_getinheritsched.c
pthread_attr_getschedparam.c
pthread_attr_getschedpolicy.c
pthread_attr_getscope.c
pthread_attr_getstack.c
pthread_attr_getstackaddr.c
pthread_attr_getstacksize.c
pthread_attr_init.c
pthread_attr_setaffinity.c
pthread_attr_setdetachstate.c
pthread_attr_setguardsize.c
pthread_attr_setinheritsched.c
pthread_attr_setschedparam.c
pthread_attr_setschedpolicy.c
pthread_attr_setscope.c
pthread_attr_setstack.c
pthread_attr_setstackaddr.c
pthread_attr_setstacksize.c
pthread_barrier_destroy.c
pthread_barrier_init.c
pthread_barrier_wait.c
pthread_barrierattr_destroy.c
pthread_barrierattr_getpshared.c
pthread_barrierattr_init.c
pthread_barrierattr_setpshared.c
pthread_cancel.c
pthread_clock_gettime.c
pthread_clock_settime.c
pthread_cond_broadcast.c
pthread_cond_common.c pthread_cond_broadcast: Fix waiters-after-spinning case [BZ #23538] 2018-08-27 17:03:35 +02:00
pthread_cond_destroy.c
pthread_cond_init.c
pthread_cond_signal.c
pthread_cond_wait.c [BZ #20271] Add newlines in __libc_fatal calls. 2018-08-31 18:04:32 -07:00
pthread_condattr_destroy.c
pthread_condattr_getclock.c
pthread_condattr_getpshared.c
pthread_condattr_init.c
pthread_condattr_setclock.c
pthread_condattr_setpshared.c
pthread_create.c
pthread_detach.c
pthread_equal.c
pthread_exit.c
pthread_getaffinity.c
pthread_getattr_default_np.c
pthread_getattr_np.c
pthread_getconcurrency.c
pthread_getcpuclockid.c
pthread_getname.c
pthread_getschedparam.c
pthread_getspecific.c
pthread_join.c
pthread_join_common.c
pthread_key_create.c
pthread_key_delete.c
pthread_kill.c
pthread_kill_other_threads.c
pthread_mutex_cond_lock.c
pthread_mutex_consistent.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_destroy.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_getprioceiling.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_init.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_lock.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_setprioceiling.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_timedlock.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_trylock.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutex_unlock.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
pthread_mutexattr_destroy.c
pthread_mutexattr_getprioceiling.c
pthread_mutexattr_getprotocol.c
pthread_mutexattr_getpshared.c
pthread_mutexattr_getrobust.c
pthread_mutexattr_gettype.c
pthread_mutexattr_init.c
pthread_mutexattr_setprioceiling.c
pthread_mutexattr_setprotocol.c
pthread_mutexattr_setpshared.c
pthread_mutexattr_setrobust.c
pthread_mutexattr_settype.c
pthread_once.c
pthread_rwlock_common.c
pthread_rwlock_destroy.c
pthread_rwlock_init.c
pthread_rwlock_rdlock.c
pthread_rwlock_timedrdlock.c
pthread_rwlock_timedwrlock.c
pthread_rwlock_tryrdlock.c
pthread_rwlock_trywrlock.c
pthread_rwlock_unlock.c
pthread_rwlock_wrlock.c
pthread_rwlockattr_destroy.c
pthread_rwlockattr_getkind_np.c
pthread_rwlockattr_getpshared.c
pthread_rwlockattr_init.c
pthread_rwlockattr_setkind_np.c
pthread_rwlockattr_setpshared.c
pthread_self.c
pthread_setaffinity.c
pthread_setattr_default_np.c
pthread_setcancelstate.c
pthread_setcanceltype.c
pthread_setconcurrency.c
pthread_setegid.c
pthread_seteuid.c
pthread_setgid.c
pthread_setname.c
pthread_setregid.c
pthread_setresgid.c
pthread_setresuid.c
pthread_setreuid.c
pthread_setschedparam.c
pthread_setschedprio.c
pthread_setspecific.c
pthread_setuid.c
pthread_sigmask.c
pthread_sigqueue.c
pthread_spin_destroy.c
pthread_spin_init.c
pthread_spin_lock.c
pthread_spin_trylock.c
pthread_spin_unlock.c
pthread_testcancel.c
pthread_timedjoin.c
pthread_tryjoin.c
pthread_yield.c
register-atfork.c
res.c
sem_close.c
sem_destroy.c
sem_getvalue.c
sem_init.c
sem_open.c
sem_post.c
sem_timedwait.c
sem_unlink.c
sem_wait.c
sem_waitcommon.c
semaphoreP.h
shlib-versions
sigaction.c
smp.h
stack-aliasing.h
test-cond-printers.c
test-cond-printers.py
test-condattr-printers.c
test-condattr-printers.py
test-mutex-printers.c
test-mutex-printers.py
test-mutexattr-printers.c
test-mutexattr-printers.py
test-rwlock-printers.c
test-rwlock-printers.py
test-rwlockattr-printers.c
test-rwlockattr-printers.py
thrd_create.c
thrd_current.c
thrd_detach.c
thrd_equal.c
thrd_exit.c
thrd_join.c
thrd_priv.h
thrd_sleep.c
thrd_yield.c
tpp.c
tss_create.c
tss_delete.c
tss_get.c
tss_set.c
tst-_res1.c
tst-_res1mod1.c
tst-_res1mod2.c
tst-abstime.c
tst-align.c
tst-align3.c
tst-atfork1.c
tst-atfork2.c
tst-atfork2mod.c
tst-attr1.c
tst-attr2.c
tst-attr3.c
tst-backtrace1.c
tst-bad-schedattr.c
tst-barrier1.c
tst-barrier2.c
tst-barrier3.c
tst-barrier4.c
tst-barrier5.c
tst-basic1.c
tst-basic2.c
tst-basic3.c
tst-basic4.c
tst-basic5.c
tst-basic6.c
tst-basic7.c
tst-call-once.c
tst-cancel-self-cancelstate.c
tst-cancel-self-canceltype.c
tst-cancel-self-cleanup.c
tst-cancel-self-testcancel.c
tst-cancel-self.c
tst-cancel-wrappers.sh
tst-cancel1.c
tst-cancel2.c
tst-cancel3.c
tst-cancel4-common.c
tst-cancel4-common.h
tst-cancel4.c
tst-cancel4_1.c
tst-cancel4_2.c
tst-cancel5.c
tst-cancel6.c
tst-cancel7.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cancel8.c
tst-cancel9.c
tst-cancel10.c
tst-cancel11.c
tst-cancel12.c
tst-cancel13.c
tst-cancel14.c
tst-cancel15.c
tst-cancel16.c
tst-cancel17.c
tst-cancel18.c
tst-cancel19.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cancel20.c
tst-cancel21-static.c
tst-cancel21.c
tst-cancel22.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cancel23.c
tst-cancel24-static.cc
tst-cancel24.cc
tst-cancel25.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cancel26.c
tst-cancel27.c
tst-cancelx1.c
tst-cancelx2.c
tst-cancelx3.c
tst-cancelx4.c
tst-cancelx5.c
tst-cancelx6.c
tst-cancelx7.c
tst-cancelx8.c
tst-cancelx9.c
tst-cancelx10.c
tst-cancelx11.c
tst-cancelx12.c
tst-cancelx13.c
tst-cancelx14.c
tst-cancelx15.c
tst-cancelx16.c
tst-cancelx17.c
tst-cancelx18.c
tst-cancelx20.c
tst-cancelx21.c
tst-cleanup0.c
tst-cleanup0.expect
tst-cleanup1.c
tst-cleanup2.c
tst-cleanup3.c
tst-cleanup4.c
tst-cleanup4aux.c
tst-cleanupx0.c
tst-cleanupx0.expect
tst-cleanupx1.c
tst-cleanupx2.c
tst-cleanupx3.c
tst-cleanupx4.c
tst-cleanupx4aux.c
tst-clock1.c
tst-clock2.c
tst-cnd-basic.c
tst-cnd-broadcast.c
tst-cnd-timedwait.c
tst-compat-forwarder-mod.c
tst-compat-forwarder.c
tst-cond-except.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cond1.c
tst-cond2.c
tst-cond3.c
tst-cond4.c
tst-cond5.c
tst-cond6.c
tst-cond7.c
tst-cond8-static.c
tst-cond8.c
tst-cond9.c
tst-cond10.c
tst-cond11.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cond12.c
tst-cond13.c
tst-cond14.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cond15.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cond16.c
tst-cond17.c
tst-cond18.c
tst-cond19.c
tst-cond20.c
tst-cond21.c
tst-cond22.c
tst-cond23.c
tst-cond24.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-cond25.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-context1.c
tst-create-detached.c
tst-default-attr.c
tst-detach1.c
tst-dlsym1.c
tst-eintr1.c
tst-eintr2.c
tst-eintr3.c
tst-eintr4.c
tst-eintr5.c
tst-exec1.c
tst-exec2.c
tst-exec3.c
tst-exec4.c
tst-exec5.c
tst-execstack-mod.c
tst-execstack.c
tst-exit1.c
tst-exit2.c
tst-exit3.c
tst-fini1.c
tst-fini1mod.c
tst-flock1.c
tst-flock2.c
tst-fork1.c
tst-fork2.c
tst-fork3.c
tst-fork4.c
tst-getpid3.c
tst-initializers1-c11.c
tst-initializers1-c89.c
tst-initializers1-c99.c
tst-initializers1-gnu11.c
tst-initializers1-gnu89.c
tst-initializers1-gnu99.c
tst-initializers1.c
tst-join1.c
tst-join2.c
tst-join3.c
tst-join4.c
tst-join5.c
tst-join6.c
tst-join7.c
tst-join7mod.c
tst-key1.c
tst-key2.c
tst-key3.c
tst-key4.c
tst-kill1.c
tst-kill2.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-kill3.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-kill4.c
tst-kill5.c
tst-kill6.c
tst-locale1.c
tst-locale2.c
tst-memstream.c
tst-minstack-cancel.c
tst-minstack-exit.c
tst-minstack-throw.cc
tst-mtx-basic.c
tst-mtx-recursive.c
tst-mtx-timedlock.c
tst-mtx-trylock.c
tst-mutex-errorcheck.c
tst-mutex1.c
tst-mutex2.c
tst-mutex3.c
tst-mutex4.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-mutex5.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-mutex5a.c
tst-mutex6.c
tst-mutex7.c
tst-mutex7a.c
tst-mutex7robust.c
tst-mutex8-static.c
tst-mutex8.c
tst-mutex9.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-mutex10.c Fix race in pthread_mutex_lock while promoting to PTHREAD_MUTEX_ELISION_NP [BZ #23275] 2018-10-17 12:23:04 +02:00
tst-mutexpi1.c
tst-mutexpi2.c
tst-mutexpi3.c
tst-mutexpi4.c
tst-mutexpi5.c
tst-mutexpi5a.c
tst-mutexpi6.c
tst-mutexpi7.c
tst-mutexpi7a.c
tst-mutexpi8-static.c
tst-mutexpi8.c
tst-mutexpi9.c
tst-mutexpp1.c
tst-mutexpp6.c
tst-mutexpp10.c
tst-oddstacklimit.c
tst-once1.c
tst-once2.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-once3.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-once4.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-once5.cc
tst-oncex3.c
tst-oncex4.c
tst-popen1.c
tst-pthread-attr-affinity.c
tst-pthread-getattr.c
tst-pthread-mutexattr.c
tst-raise1.c
tst-robust-fork.c
tst-robust1.c
tst-robust2.c
tst-robust3.c
tst-robust4.c
tst-robust5.c
tst-robust6.c
tst-robust7.c
tst-robust8.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-robust9.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-robust10.c
tst-robustpi1.c
tst-robustpi2.c
tst-robustpi3.c
tst-robustpi4.c
tst-robustpi5.c
tst-robustpi6.c
tst-robustpi7.c
tst-robustpi8.c
tst-robustpi9.c
tst-rwlock1.c
tst-rwlock2.c
tst-rwlock2a.c
tst-rwlock2b.c
tst-rwlock3.c
tst-rwlock4.c
tst-rwlock5.c
tst-rwlock6.c
tst-rwlock7.c
tst-rwlock8.c
tst-rwlock9.c
tst-rwlock10.c
tst-rwlock11.c
tst-rwlock12.c
tst-rwlock13.c
tst-rwlock14.c
tst-rwlock15.c
tst-rwlock16.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-rwlock17.c
tst-rwlock18.c
tst-rwlock19.c
tst-rwlock20.c
tst-sched1.c
tst-sem1.c
tst-sem2.c
tst-sem3.c
tst-sem4.c
tst-sem5.c
tst-sem6.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-sem7.c
tst-sem8.c
tst-sem9.c
tst-sem10.c
tst-sem11-static.c
tst-sem11.c
tst-sem12-static.c
tst-sem12.c
tst-sem13.c
tst-sem14.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-sem15.c
tst-sem16.c
tst-setuid1-static.c
tst-setuid1.c
tst-setuid2.c
tst-setuid3.c
tst-signal1.c
tst-signal2.c
tst-signal3.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-signal4.c
tst-signal5.c
tst-signal6.c
tst-signal7.c
tst-spin1.c
tst-spin2.c
tst-spin3.c
tst-spin4.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-stack1.c
tst-stack2.c
tst-stack3.c
tst-stack4.c
tst-stack4mod.c
tst-stackguard1-static.c
tst-stackguard1.c
tst-stdio1.c
tst-stdio2.c
tst-sysconf.c
tst-thrd-detach.c
tst-thrd-sleep.c
tst-thread-exit-clobber.cc
tst-thread_local1.cc
tst-tls1.c
tst-tls2.c
tst-tls3-malloc.c
tst-tls3.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-tls3mod.c
tst-tls4.c Don't reduce test timeout to less than default 2018-10-17 09:34:13 +02:00
tst-tls4moda.c
tst-tls4modb.c
tst-tls5.c
tst-tls5.h
tst-tls5mod.c
tst-tls5moda.c
tst-tls5modb.c
tst-tls5modc.c
tst-tls5modd.c
tst-tls5mode.c
tst-tls5modf.c
tst-tls6.sh
tst-tpp.h
tst-tsd1.c
tst-tsd2.c
tst-tsd3.c
tst-tsd4.c
tst-tsd5.c
tst-tsd6.c
tst-tss-basic.c
tst-umask1.c
tst-unload.c
tst-vfork1.c
tst-vfork1x.c
tst-vfork2.c
tst-vfork2x.c
unwind.c
unwindbuf.sym
vars.c
version.c