diff --git a/lib/lockref.c b/lib/lockref.c
index e294ae445c9ab4b7e97dd1a46efc7dc7d6a1848d..6f9d434c1521eab9ca0b2821d10936af55f2b703 100644
--- a/lib/lockref.c
+++ b/lib/lockref.c
@@ -11,6 +11,14 @@
 # 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)