aboutsummaryrefslogtreecommitdiffstats
path: root/lib/lockref.c
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-23 06:59:56 -0400
committerHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-28 06:46:24 -0400
commit491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46 (patch)
tree81cb77f31a841e87cecb9329f26e6524cc44f3a2 /lib/lockref.c
parent083986e8248d978b6c961d3da6beb0c921c68220 (diff)
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/lockref.c')
-rw-r--r--lib/lockref.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/lockref.c b/lib/lockref.c
index e294ae445c9a..6f9d434c1521 100644
--- a/lib/lockref.c
+++ b/lib/lockref.c
@@ -12,6 +12,14 @@
12#endif 12#endif
13 13
14/* 14/*
15 * Allow architectures to override the default cpu_relax() within CMPXCHG_LOOP.
16 * This is useful for architectures with an expensive cpu_relax().
17 */
18#ifndef arch_mutex_cpu_relax
19# define arch_mutex_cpu_relax() cpu_relax()
20#endif
21
22/*
15 * Note that the "cmpxchg()" reloads the "old" value for the 23 * Note that the "cmpxchg()" reloads the "old" value for the
16 * failure case. 24 * failure case.
17 */ 25 */
@@ -28,7 +36,7 @@
28 if (likely(old.lock_count == prev.lock_count)) { \ 36 if (likely(old.lock_count == prev.lock_count)) { \
29 SUCCESS; \ 37 SUCCESS; \
30 } \ 38 } \
31 cpu_relax(); \ 39 arch_mutex_cpu_relax(); \
32 } \ 40 } \
33} while (0) 41} while (0)
34 42