|
@@ -11,6 +11,14 @@
|
|
|
# define cmpxchg64_relaxed cmpxchg64
|
|
# define cmpxchg64_relaxed cmpxchg64
|
|
|
#endif
|
|
#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
|
|
* Note that the "cmpxchg()" reloads the "old" value for the
|
|
|
* failure case.
|
|
* failure case.
|
|
@@ -28,7 +36,7 @@
|
|
|
if (likely(old.lock_count == prev.lock_count)) { \
|
|
if (likely(old.lock_count == prev.lock_count)) { \
|
|
|
SUCCESS; \
|
|
SUCCESS; \
|
|
|
} \
|
|
} \
|
|
|
- cpu_relax(); \
|
|
|
|
|
|
|
+ arch_mutex_cpu_relax(); \
|
|
|
} \
|
|
} \
|
|
|
} while (0)
|
|
} while (0)
|
|
|
|
|
|