glibc/sysdeps/unix/sysv/linux/x86_64
Torvald Riegel 65810f0ef0 robust mutexes: Fix broken x86 assembly by removing it
lll_robust_unlock on i386 and x86_64 first sets the futex word to
FUTEX_WAITERS|0 before calling __lll_unlock_wake, which will set the
futex word to 0.  If the thread is killed between these steps, then the
futex word will be FUTEX_WAITERS|0, and the kernel (at least current
upstream) will not set it to FUTEX_OWNER_DIED|FUTEX_WAITERS because 0 is
not equal to the TID of the crashed thread.

The lll_robust_lock assembly code on i386 and x86_64 is not prepared to
deal with this case because the fastpath tries to only CAS 0 to TID and
not FUTEX_WAITERS|0 to TID; the slowpath simply waits until it can CAS 0
to TID or the futex_word has the FUTEX_OWNER_DIED bit set.

This issue is fixed by removing the custom x86 assembly code and using
the generic C code instead.  However, instead of adding more duplicate
code to the custom x86 lowlevellock.h, the code of the lll_robust* functions
is inlined into the single call sites that exist for each of these functions
in the pthread_mutex_* functions.  The robust mutex paths in the latter
have been slightly reorganized to make them simpler.

This patch is meant to be easy to backport, so C11-style atomics are not
used.

	[BZ #20985]
	* nptl/Makefile: Adapt.
	* nptl/pthread_mutex_cond_lock.c (LLL_ROBUST_MUTEX_LOCK): Remove.
	(LLL_ROBUST_MUTEX_LOCK_MODIFIER): New.
	* nptl/pthread_mutex_lock.c (LLL_ROBUST_MUTEX_LOCK): Remove.
	(LLL_ROBUST_MUTEX_LOCK_MODIFIER): New.
	(__pthread_mutex_lock_full): Inline lll_robust* functions and adapt.
	* nptl/pthread_mutex_timedlock.c (pthread_mutex_timedlock): Inline
	lll_robust* functions and adapt.
	* nptl/pthread_mutex_unlock.c (__pthread_mutex_unlock_full): Likewise.
	* sysdeps/nptl/lowlevellock.h (__lll_robust_lock_wait,
	__lll_robust_lock, lll_robust_cond_lock, __lll_robust_timedlock_wait,
	__lll_robust_timedlock, __lll_robust_unlock): Remove.
	* sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_robust_lock,
	lll_robust_cond_lock, lll_robust_timedlock, lll_robust_unlock): Remove.
	* sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_robust_lock,
	lll_robust_cond_lock, lll_robust_timedlock, lll_robust_unlock): Remove.
	* sysdeps/unix/sysv/linux/sparc/lowlevellock.h (__lll_robust_lock_wait,
	__lll_robust_lock, lll_robust_cond_lock, __lll_robust_timedlock_wait,
	__lll_robust_timedlock, __lll_robust_unlock): Remove.
	* nptl/lowlevelrobustlock.c: Remove file.
	* nptl/lowlevelrobustlock.sym: Likewise.
	* sysdeps/unix/sysv/linux/i386/lowlevelrobustlock.S: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S: Likewise.
2017-01-13 17:16:07 +01:00
..
64 Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
x32 Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
____longjmp_chk.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__start_context.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
arch-fork.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
brk.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
cancellation.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
clone.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
compat-timer.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
configure
configure.ac
dl-cache.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
dl-procinfo.c Add _dl_x86_cpu_features to rtld_global 2015-08-13 03:41:22 -07:00
dl-procinfo.h
get_clockfreq.c
getcontext.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
Implies
init-first.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ipc_priv.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
kernel_stat.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
kernel-features.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ldconfig.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ldd-rewrite.sed
libc-cancellation.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
libc-lowlevellock.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
libmvec.abilist Simplify the abilist format 2015-11-06 13:58:53 +01:00
librt-cancellation.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
lll_timedlock_wait.c
lll_timedwait_tid.c
lowlevellock.h robust mutexes: Fix broken x86 assembly by removing it 2017-01-13 17:16:07 +01:00
lowlevellock.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
makecontext.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
Makefile
profil-counter.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
pthread_setaffinity.c
readelflib.c
recv.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
register-dump.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
sched_setaffinity.c
send.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
setcontext.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
sigaction.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
sigaltstack-offsets.sym
sigcontextinfo.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
sigpending.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
sigprocmask.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
swapcontext.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
syscall.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
syscalls.list Use shmget syscall for linux implementation 2016-12-28 20:31:05 -02:00
sysdep-cancel.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
sysdep.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
sysdep.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
timer_create.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
timer_delete.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
timer_getoverr.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
timer_gettime.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
timer_settime.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ucontext_i.sym
umount.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
Versions Revert {send,sendm,recv,recvm}msg conformance changes 2016-06-10 11:58:16 -03:00
vfork.S Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00