[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 Fri, 2015-07-31 at 12:41 +0100, 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().

IMHO it should be in spin_{relax,signal} if it is needed.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.