Ping. This improves current sync spec and implementation.
> -----Original Message----- > From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of EXT > Petri Savolainen > Sent: Monday, October 26, 2015 6:08 PM > To: lng-odp@lists.linaro.org > Subject: [lng-odp] [API-NEXT PATCH] api: sync: update spec and add > odp_sync_loads > > Updated odp_sync_stores() specification and added odp_sync_loads > to pair it. Used GCC __atomic_thread_fence to implement both of > those. > > Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com> > --- > include/odp/api/sync.h | 53 +++++++++++++++----------- > ----- > platform/linux-generic/include/odp/sync.h | 18 +++++++++++ > 2 files changed, 43 insertions(+), 28 deletions(-) > > diff --git a/include/odp/api/sync.h b/include/odp/api/sync.h > index 6477e74..8456f68 100644 > --- a/include/odp/api/sync.h > +++ b/include/odp/api/sync.h > @@ -23,37 +23,34 @@ extern "C" { > */ > > /** > - * Synchronise stores > + * Synchronize stores > * > - * Ensures that all CPU store operations that precede the > odp_sync_stores() > - * call are globally visible before any store operation that follows it. > + * This call implements a write memory barrier between threads. It > ensures that > + * all (non-atomic or relaxed atomic) stores (from the calling thread) > that > + * precede this call are globally visible before any store operation that > + * follows it. It prevents stores moving from before the call to after > it. > + * > + * ODP synchronization mechanisms (e.g. barrier, unlocks, queue enqueues) > + * include write barrier, so this call is not needed when using those. > + * > + * @see odp_sync_loads() > */ > -static inline void odp_sync_stores(void) > -{ > -#if defined __x86_64__ || defined __i386__ > - > - __asm__ __volatile__ ("sfence\n" : : : "memory"); > - > -#elif defined(__arm__) > -#if __ARM_ARCH == 6 > - __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ > - : : "r" (0) : "memory"); > -#elif __ARM_ARCH >= 7 || defined __aarch64__ > - > - __asm__ __volatile__ ("dmb st" : : : "memory"); > -#else > - __asm__ __volatile__ ("" : : : "memory"); > -#endif > - > -#elif defined __OCTEON__ > - > - __asm__ __volatile__ ("syncws\n" : : : "memory"); > - > -#else > - __sync_synchronize(); > -#endif > -} > +void odp_sync_stores(void); > > +/** > + * Synchronize loads > + * > + * This call implements a read memory barrier. It ensures that all (non- > atomic > + * or relaxed atomic) loads that precede this call happen before any load > + * operation that follows it. It prevents loads moving from after the > call to > + * before it. > + * > + * ODP synchronization mechanisms (e.g. barrier, locks, queue dequeues) > + * include read barrier, so this call is not needed when using those. > + * > + * @see odp_sync_stores() > + */ > +void odp_sync_loads(void); > > /** > * @} > diff --git a/platform/linux-generic/include/odp/sync.h b/platform/linux- > generic/include/odp/sync.h > index bc73083..09b3939 100644 > --- a/platform/linux-generic/include/odp/sync.h > +++ b/platform/linux-generic/include/odp/sync.h > @@ -17,6 +17,24 @@ > extern "C" { > #endif > > +/** @ingroup odp_barrier > + * @{ > + */ > + > +static inline void odp_sync_stores(void) > +{ > + __atomic_thread_fence(__ATOMIC_RELEASE); > +} > + > +static inline void odp_sync_loads(void) > +{ > + __atomic_thread_fence(__ATOMIC_ACQUIRE); > +} > + > +/** > + * @} > + */ > + > #include <odp/api/sync.h> > > #ifdef __cplusplus > -- > 2.6.2 > > _______________________________________________ > lng-odp mailing list > lng-odp@lists.linaro.org > https://lists.linaro.org/mailman/listinfo/lng-odp _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp