Use C11-like atomics instead of plain memory accesses in x86 lock elision.
authorTorvald Riegel <triegel@redhat.com>
Wed, 30 Nov 2016 16:53:11 +0000 (17:53 +0100)
committerTorvald Riegel <triegel@redhat.com>
Mon, 5 Dec 2016 15:19:43 +0000 (16:19 +0100)
commitca6e601a9d4a72b3699cca15bad12ac1716bf49a
treefd761ea31c43377d02f2a097f8030411163d6905
parent71be79a25f1d9efeafa5c634c4499281e8c313f2
Use C11-like atomics instead of plain memory accesses in x86 lock elision.

This uses atomic operations to access lock elision metadata that is accessed
concurrently (ie, adapt_count fields).  The size of the data is less than a
word but accessed only with atomic loads and stores; therefore, we add
support for shorter-size atomic load and stores too.

* include/atomic.h (__atomic_check_size_ls): New.
(atomic_load_relaxed, atomic_load_acquire, atomic_store_relaxed,
atomic_store_release): Use it.
* sysdeps/x86/elide.h (ACCESS_ONCE): Remove.
(elision_adapt, ELIDE_LOCK): Use atomics.
* sysdeps/unix/sysv/linux/x86/elision-lock.c (__lll_lock_elision): Use
atomics and improve code comments.
* sysdeps/unix/sysv/linux/x86/elision-trylock.c
(__lll_trylock_elision): Likewise.
ChangeLog
include/atomic.h
sysdeps/unix/sysv/linux/x86/elision-lock.c
sysdeps/unix/sysv/linux/x86/elision-trylock.c
sysdeps/x86/elide.h