|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv1] arm: reduce power use by contented spin locks with WFE/SEV
On 31/07/15 11:45, David Vrabel wrote:
> 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>
x86 bits Reviewed-by: Andrew Cooper <andrew.cooper3@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 */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |