[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCHv1] arm: reduce power use by contented spin locks with WFE/SEV
Instead of cpu_relax() while spinning and observing the ticket head, introduce spin_relax() which executes a WFE instruction. After the ticket head is changed call spin_signal() to execute an SVE instruction to wake any spinners. This should improve power consumption when locks are contented and spinning. Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> --- I've not tested this but it looks straight-forward... --- xen/common/spinlock.c | 5 +++-- xen/include/asm-arm/spinlock.h | 3 ++- xen/include/asm-x86/spinlock.h | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index 29149d1..fc3e8e7 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -141,7 +141,7 @@ void _spin_lock(spinlock_t *lock) while ( tickets.tail != observe_head(&lock->tickets) ) { LOCK_PROFILE_BLOCK; - cpu_relax(); + spin_relax(); } LOCK_PROFILE_GOT; preempt_disable(); @@ -170,6 +170,7 @@ void _spin_unlock(spinlock_t *lock) preempt_enable(); LOCK_PROFILE_REL; add_sized(&lock->tickets.head, 1); + spin_signal(); } void _spin_unlock_irq(spinlock_t *lock) @@ -228,7 +229,7 @@ void _spin_barrier(spinlock_t *lock) if ( sample.head != sample.tail ) { while ( observe_head(&lock->tickets) == sample.head ) - cpu_relax(); + spin_relax(); #ifdef LOCK_PROFILE if ( lock->profile ) { diff --git a/xen/include/asm-arm/spinlock.h b/xen/include/asm-arm/spinlock.h index 81955d1..311764b 100644 --- a/xen/include/asm-arm/spinlock.h +++ b/xen/include/asm-arm/spinlock.h @@ -1,6 +1,7 @@ #ifndef __ASM_SPINLOCK_H #define __ASM_SPINLOCK_H -/* Nothing ARM specific. */ +#define spin_relax() asm volatile("wfe" ::: "memory"); +#define spin_signal() asm volatile("sev" ::: "memory"); #endif /* __ASM_SPINLOCK_H */ diff --git a/xen/include/asm-x86/spinlock.h b/xen/include/asm-x86/spinlock.h index 7d69e75..0c04a4e 100644 --- a/xen/include/asm-x86/spinlock.h +++ b/xen/include/asm-x86/spinlock.h @@ -4,4 +4,7 @@ #define _raw_read_unlock(l) \ asm volatile ( "lock; dec%z0 %0" : "+m" ((l)->lock) :: "memory" ) +#define spin_relax() cpu_relax() +#define spin_signal() + #endif /* __ASM_SPINLOCK_H */ -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |