summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-23 12:59:56 +0200
committerMaciej Wereski <m.wereski@partner.samsung.com>2015-03-18 09:47:12 +0100
commitda942bcb61bf36f32470f5c36e1ee4cb284be7f3 (patch)
tree950a959351e65facaaaaaee9fcc5316e907c2c95 /lib
parenteb93167dc9518ebac216c6481aacd68d58acc963 (diff)
downloadlinux-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.c9
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)