forked from Minki/linux
locking/mcs: Use smp_cond_load_acquire() in MCS spin loop
For qspinlocks on ARM64, we would like to use WFE instead of purely spinning. Qspinlocks internally have lock contenders spin on an MCS lock. Update arch_mcs_spin_lock_contended() such that it uses the new smp_cond_load_acquire() so that ARM64 can also override this spin loop with its own implementation using WFE. On x86, this can also be cheaper than spinning on smp_load_acquire(). Signed-off-by: Jason Low <jason.low2@hp.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Waiman Long <longman@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: boqun.feng@gmail.com Cc: linux-arm-kernel@lists.infradead.org Cc: paulmck@linux.vnet.ibm.com Link: http://lkml.kernel.org/r/1524738868-31318-9-git-send-email-will.deacon@arm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
f9c811fac4
commit
7f56b58a92
@ -23,13 +23,15 @@ struct mcs_spinlock {
|
||||
|
||||
#ifndef arch_mcs_spin_lock_contended
|
||||
/*
|
||||
* Using smp_load_acquire() provides a memory barrier that ensures
|
||||
* subsequent operations happen after the lock is acquired.
|
||||
* Using smp_cond_load_acquire() provides the acquire semantics
|
||||
* required so that subsequent operations happen after the
|
||||
* lock is acquired. Additionally, some architectures such as
|
||||
* ARM64 would like to do spin-waiting instead of purely
|
||||
* spinning, and smp_cond_load_acquire() provides that behavior.
|
||||
*/
|
||||
#define arch_mcs_spin_lock_contended(l) \
|
||||
do { \
|
||||
while (!(smp_load_acquire(l))) \
|
||||
cpu_relax(); \
|
||||
smp_cond_load_acquire(l, VAL); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user