lockref: use arch_mutex_cpu_relax() in CMPXCHG_LOOP()
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 23 Sep 2013 10:59:56 +0000 (12:59 +0200)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Sat, 28 Sep 2013 10:46:24 +0000 (12:46 +0200)
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>
lib/lockref.c

index e294ae445c9ab4b7e97dd1a46efc7dc7d6a1848d..6f9d434c1521eab9ca0b2821d10936af55f2b703 100644 (file)
 # define cmpxchg64_relaxed cmpxchg64
 #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)