diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2013-09-23 12:59:56 +0200 |
---|---|---|
committer | Maciej Wereski <m.wereski@partner.samsung.com> | 2015-03-18 09:47:12 +0100 |
commit | da942bcb61bf36f32470f5c36e1ee4cb284be7f3 (patch) | |
tree | 950a959351e65facaaaaaee9fcc5316e907c2c95 /lib | |
parent | eb93167dc9518ebac216c6481aacd68d58acc963 (diff) | |
download | linux-3.10-da942bcb61bf36f32470f5c36e1ee4cb284be7f3.tar.gz linux-3.10-da942bcb61bf36f32470f5c36e1ee4cb284be7f3.tar.bz2 linux-3.10-da942bcb61bf36f32470f5c36e1ee4cb284be7f3.zip |
lockref: use arch_mutex_cpu_relax() in CMPXCHG_LOOP()
Make use of arch_mutex_cpu_relax() so architectures can override the
default cpu_relax() semantics.
This is especially useful for s390, where cpu_relax() means that we
yield() the current (virtual) cpu and therefore is very expensive,
and would contradict the whole purpose of the lockless cmpxchg loop.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/lockref.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/lockref.c b/lib/lockref.c index 4f88c9355e9..82deca5d7ed 100644 --- a/lib/lockref.c +++ b/lib/lockref.c @@ -12,6 +12,14 @@ #endif /* + * Allow architectures to override the default cpu_relax() within CMPXCHG_LOOP. + * This is useful for architectures with an expensive cpu_relax(). + */ +#ifndef arch_mutex_cpu_relax +# define arch_mutex_cpu_relax() cpu_relax() +#endif + +/* * Note that the "cmpxchg()" reloads the "old" value for the * failure case. */ @@ -28,6 +36,7 @@ if (likely(old.lock_count == prev.lock_count)) { \ SUCCESS; \ } \ + arch_mutex_cpu_relax(); \ } \ } while (0) |