From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: Re: [PATCHv2 3/6] xen: generic xadd() for ticket locks Date: Tue, 14 Apr 2015 14:17:08 +0100 Message-ID: <1429017428.15516.49.camel@citrix.com> References: <1428675597-28465-1-git-send-email-david.vrabel@citrix.com> <1428675597-28465-4-git-send-email-david.vrabel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Yi0iH-00087F-1D for xen-devel@lists.xenproject.org; Tue, 14 Apr 2015 13:17:13 +0000 In-Reply-To: <1428675597-28465-4-git-send-email-david.vrabel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: David Vrabel Cc: xen-devel@lists.xenproject.org, Keir Fraser , Tim Deegan , Jan Beulich , Stefano Stabellini List-Id: xen-devel@lists.xenproject.org On Fri, 2015-04-10 at 15:19 +0100, David Vrabel wrote: > This is only temporary until arm/arm64 provides an xadd() > implementation. I'll assume that you aren't planning on doing this and add it to my own TODO list. Although, I'm more than willing to be preempted by another ARM dev... > > Signed-off-by: David Vrabel > --- > xen/common/spinlock.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c > index 5fd8b1c..0c4289c 100644 > --- a/xen/common/spinlock.c > +++ b/xen/common/spinlock.c > @@ -10,6 +10,27 @@ > #include > #include > > +#ifndef xadd > + > +static u32 generic_xaddl(volatile u32 *ptr, u32 v) > +{ > + u32 old, new, prev; > + > + old = read_atomic(ptr); > + for(;;) { > + new = old + v; > + prev = cmpxchg(ptr, old, new); > + if (prev == old) > + break; > + old = prev; > + } > + return old; > +} > + > +#define xadd(ptr, v) generic_xaddl((ptr), (v)) > + > +#endif > + > #ifndef NDEBUG > > static atomic_t spin_debug __read_mostly = ATOMIC_INIT(0);