|
[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 12:41, Stefano Stabellini wrote:
> On Fri, 31 Jul 2015, Julien Grall wrote:
>> Hi David,
>>
>> On 31/07/15 11:52, David Vrabel wrote:
>>> 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>
>>>> ---
>>>> 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();
>>>
>>> It occurs to me that perhaps there should be a barrier between the
>>> add_sized() and the spin_signal() so the update value is visible before
>>> we signal (otherwise the spinner may be woken and observe the old value
>>> and WFE again).
>>
>> sev is usually precede by dsb to ensure that all the instructions before
>> as completed before executing the sev.
>
> Yes, a dsb() is required. This being common code, we could use wmb().
You should put the barrier required for the SEV in spin_signal() so an
additional barrier is not required on other archs.
David
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |