summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-23 12:59:56 +0200
committerHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-28 12:46:24 +0200
commit491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46 (patch)
tree81cb77f31a841e87cecb9329f26e6524cc44f3a2
parentmutex: replace CONFIG_HAVE_ARCH_MUTEX_CPU_RELAX with simple ifdef (diff)
downloadlinux-491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46.tar.xz
linux-491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46.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 '')
-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 @@
#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,7 +36,7 @@
if (likely(old.lock_count == prev.lock_count)) { \
SUCCESS; \
} \
- cpu_relax(); \
+ arch_mutex_cpu_relax(); \
} \
} while (0)