> -----Original Message-----
> From: Thomas Monjalon <tho...@monjalon.net>
> Sent: Friday, November 8, 2019 5:00 PM
> To: Ananyev, Konstantin <konstantin.anan...@intel.com>
> Cc: David Marchand <david.march...@redhat.com>; dev@dpdk.org; n...@arm.com; 
> Gavin Hu <gavin...@arm.com>; Mcnamara, John
> <john.mcnam...@intel.com>; Kovacevic, Marko <marko.kovace...@intel.com>; 
> Jerin Jacob <jer...@marvell.com>; Jan Viktorin
> <vikto...@rehivetech.com>
> Subject: Re: [PATCH v13 2/5] eal: add the APIs to wait until equal
> 
> 08/11/2019 17:38, Ananyev, Konstantin:
> > > From: Gavin Hu <gavin...@arm.com>
> > > +static __rte_always_inline void
> > > +rte_wait_until_equal_64(volatile uint64_t *addr, uint64_t expected,
> > > +         int memorder)
> > > +{
> > > + uint64_t value;
> > > +
> > > + assert(memorder == __ATOMIC_ACQUIRE || memorder == __ATOMIC_RELAXED);
> > > +
> > > + /*
> > > +  * Atomic exclusive load from addr, it returns the 64-bit content of
> > > +  * *addr while making it 'monitored',when it is written by someone
> > > +  * else, the 'monitored' state is cleared and a event is generated
> > > +  * implicitly to exit WFE.
> > > +  */
> > > +#define __LOAD_EXC_64(src, dst, memorder) {              \
> > > + if (memorder == __ATOMIC_RELAXED) {              \
> > > +         asm volatile("ldxr %x[tmp], [%x[addr]]"  \
> > > +                 : [tmp] "=&r" (dst)              \
> > > +                 : [addr] "r"(src)                \
> > > +                 : "memory");                     \
> > > + } else {                                         \
> > > +         asm volatile("ldaxr %x[tmp], [%x[addr]]" \
> > > +                 : [tmp] "=&r" (dst)              \
> > > +                 : [addr] "r"(src)                \
> > > +                 : "memory");                     \
> > > + } }
> > > +
> > > + __LOAD_EXC_64(addr, value, memorder)
> > > + if (value != expected) {
> > > +         __SEVL()
> > > +         do {
> > > +                 __WFE()
> > > +                 __LOAD_EXC_64(addr, value, memorder)
> > > +         } while (value != expected);
> > > + }
> > > +}
> > > +#undef __LOAD_EXC_64
> > > +
> > > +#undef __SEVL
> > > +#undef __WFE
> >
> > Personally I don't see how these define/undef are better then inline 
> > functions...
> 
> The benefit it to not pollute the API namespace
> with some functions which are used only locally.
> After using a macro, it disappears with #undef.
> 
> > Again I suppose they might be re-used in future some other ARM specific 
> > low-level primitvies.
> 
> Do this low-level routines _LOAD_EXC_ need to be exposed in EAL for re-use?

About load_exc don't know for sure...
Though as I can see wfe/sevl are used here:
http://patchwork.dpdk.org/patch/61779/
Might be it is possible to reuse these functions/macros...
But again, I am not arm expert, would be interested to know what arm guys think.

> 
> > My preference would be to keep them as inline function - much cleaner code.
> > But as I don't develop for/use, I wouldn't insist and let you and arm guys 
> > to decide.
> 
> 

Reply via email to