Use WFE to avoid most spinning with MCS spinlocks. This is implemented with the new cmpwait() mechanism for comparing and waiting for the MCS locked value to change using LDXR + WFE.
Signed-off-by: Jason Low <[email protected]> --- arch/arm64/include/asm/mcs_spinlock.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 arch/arm64/include/asm/mcs_spinlock.h diff --git a/arch/arm64/include/asm/mcs_spinlock.h b/arch/arm64/include/asm/mcs_spinlock.h new file mode 100644 index 0000000..d295d9d --- /dev/null +++ b/arch/arm64/include/asm/mcs_spinlock.h @@ -0,0 +1,21 @@ +#ifndef __ASM_MCS_SPINLOCK_H +#define __ASM_MCS_SPINLOCK_H + +#define arch_mcs_spin_lock_contended(l) \ +do { \ + int locked_val; \ + for (;;) { \ + locked_val = READ_ONCE(*l); \ + if (locked_val) \ + break; \ + cmpwait(l, locked_val); \ + } \ + smp_rmb(); \ +} while (0) + +#define arch_mcs_spin_unlock_contended(l) \ +do { \ + smp_store_release(l, 1); \ +} while (0) + +#endif /* __ASM_MCS_SPINLOCK_H */ -- 2.1.4

