diff options
author | Andi Kleen <ak@linux.intel.com> | 2012-12-22 01:03:04 -0800 |
---|---|---|
committer | Andi Kleen <ak@linux.intel.com> | 2013-07-02 08:46:55 -0700 |
commit | e8c659d74e011346785355eeef03b7fb6f533c61 (patch) | |
tree | 7791d2e0769dc19ff7b549be745e4ddc251c3b7a /nptl/sysdeps/unix/sysv/linux/x86/bits | |
parent | 68cc29355f3334c7ad18f648ff9a6383a0916d23 (diff) | |
download | glibc-e8c659d74e011346785355eeef03b7fb6f533c61.tar.gz glibc-e8c659d74e011346785355eeef03b7fb6f533c61.tar.xz glibc-e8c659d74e011346785355eeef03b7fb6f533c61.zip |
Add elision to pthread_mutex_{try,timed,un}lock
Add elision paths to the basic mutex locks. The normal path has a check for RTM and upgrades the lock to RTM when available. Trylocks cannot automatically upgrade, so they check for elision every time. We use a 4 byte value in the mutex to store the lock elision adaptation state. This is separate from the adaptive spin state and uses a separate field. Condition variables currently do not support elision. Recursive mutexes and condition variables may be supported at some point, but are not in the current implementation. Also "trylock" will not automatically enable elision unless some other lock call has been already called on the lock. This version does not use IFUNC, so it means every lock has one additional check for elision. Benchmarking showed the overhead to be negligible.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/x86/bits')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h b/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h index ccd896ca03..1852e07842 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h +++ b/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h @@ -101,14 +101,23 @@ typedef union binary compatibility. */ int __kind; #ifdef __x86_64__ - int __spins; + short __spins; + short __elision; __pthread_list_t __list; # define __PTHREAD_MUTEX_HAVE_PREV 1 +# define __PTHREAD_MUTEX_HAVE_ELISION 1 #else unsigned int __nusers; __extension__ union { - int __spins; + struct + { + short __espins; + short __elision; +# define __spins d.__espins +# define __elision d.__elision +# define __PTHREAD_MUTEX_HAVE_ELISION 2 + } d; __pthread_slist_t __list; }; #endif |