ARM: 8098/1: mcs lock: implement wfe-based polling for MCS locking
authorWill Deacon <will.deacon@arm.com>
Wed, 9 Jul 2014 18:31:28 +0000 (19:31 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 18 Jul 2014 11:29:35 +0000 (12:29 +0100)
This patch introduces a wfe-based polling loop for spinning on contended
MCS locks and waking up corresponding waiters when the lock is released.

Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/mcs_spinlock.h [new file with mode: 0644]

diff --git a/arch/arm/include/asm/mcs_spinlock.h b/arch/arm/include/asm/mcs_spinlock.h
new file mode 100644 (file)
index 0000000..f652ad6
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef __ASM_MCS_LOCK_H
+#define __ASM_MCS_LOCK_H
+
+#ifdef CONFIG_SMP
+#include <asm/spinlock.h>
+
+/* MCS spin-locking. */
+#define arch_mcs_spin_lock_contended(lock)                             \
+do {                                                                   \
+       /* Ensure prior stores are observed before we enter wfe. */     \
+       smp_mb();                                                       \
+       while (!(smp_load_acquire(lock)))                               \
+               wfe();                                                  \
+} while (0)                                                            \
+
+#define arch_mcs_spin_unlock_contended(lock)                           \
+do {                                                                   \
+       smp_store_release(lock, 1);                                     \
+       dsb_sev();                                                      \
+} while (0)
+
+#endif /* CONFIG_SMP */
+#endif /* __ASM_MCS_LOCK_H */