Do we need to have all these #ifdef, it looks messy, can you not define a macro that is defined based upon
RTE_ARCH_STRONGLY_ORDERED_MEM_OP /Simon On 11/03/2015 03:52 PM, Jerin Jacob wrote: > rte_ring implementation needs explicit memory barrier > in weakly ordered architecture like ARM unlike > strongly ordered architecture like X86 > > Introducing RTE_ARCH_STRONGLY_ORDERED_MEM_OPS > configuration to abstract such dependency so that other > weakly ordered architectures can reuse this infrastructure. > > Signed-off-by: Jerin Jacob <jerin.jacob at caviumnetworks.com> > --- > config/common_bsdapp | 5 +++++ > config/common_linuxapp | 5 +++++ > config/defconfig_arm64-armv8a-linuxapp-gcc | 1 + > config/defconfig_arm64-thunderx-linuxapp-gcc | 1 + > lib/librte_ring/rte_ring.h | 20 ++++++++++++++++++++ > 5 files changed, 32 insertions(+) > > diff --git a/config/common_bsdapp b/config/common_bsdapp > index b37dcf4..c8d1f63 100644 > --- a/config/common_bsdapp > +++ b/config/common_bsdapp > @@ -79,6 +79,11 @@ CONFIG_RTE_FORCE_INTRINSICS=n > CONFIG_RTE_ARCH_STRICT_ALIGN=n > > # > +# Machine has strongly-ordered memory operations on normal memory like x86 > +# > +CONFIG_RTE_ARCH_STRONGLY_ORDERED_MEM_OPS=y > + > +# > # Compile to share library > # > CONFIG_RTE_BUILD_SHARED_LIB=n > diff --git a/config/common_linuxapp b/config/common_linuxapp > index 0de43d5..d040a74 100644 > --- a/config/common_linuxapp > +++ b/config/common_linuxapp > @@ -79,6 +79,11 @@ CONFIG_RTE_FORCE_INTRINSICS=n > CONFIG_RTE_ARCH_STRICT_ALIGN=n > > # > +# Machine has strongly-ordered memory operations on normal memory like x86 > +# > +CONFIG_RTE_ARCH_STRONGLY_ORDERED_MEM_OPS=y > + > +# > # Compile to share library > # > CONFIG_RTE_BUILD_SHARED_LIB=n > diff --git a/config/defconfig_arm64-armv8a-linuxapp-gcc > b/config/defconfig_arm64-armv8a-linuxapp-gcc > index 6ea38a5..5289152 100644 > --- a/config/defconfig_arm64-armv8a-linuxapp-gcc > +++ b/config/defconfig_arm64-armv8a-linuxapp-gcc > @@ -37,6 +37,7 @@ CONFIG_RTE_ARCH="arm64" > CONFIG_RTE_ARCH_ARM64=y > CONFIG_RTE_ARCH_64=y > CONFIG_RTE_ARCH_ARM_NEON=y > +CONFIG_RTE_ARCH_STRONGLY_ORDERED_MEM_OPS=n > > CONFIG_RTE_FORCE_INTRINSICS=y > > diff --git a/config/defconfig_arm64-thunderx-linuxapp-gcc > b/config/defconfig_arm64-thunderx-linuxapp-gcc > index e8fccc7..79fa9e6 100644 > --- a/config/defconfig_arm64-thunderx-linuxapp-gcc > +++ b/config/defconfig_arm64-thunderx-linuxapp-gcc > @@ -37,6 +37,7 @@ CONFIG_RTE_ARCH="arm64" > CONFIG_RTE_ARCH_ARM64=y > CONFIG_RTE_ARCH_64=y > CONFIG_RTE_ARCH_ARM_NEON=y > +CONFIG_RTE_ARCH_STRONGLY_ORDERED_MEM_OPS=n > > CONFIG_RTE_FORCE_INTRINSICS=y > > diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h > index af68888..1ccd186 100644 > --- a/lib/librte_ring/rte_ring.h > +++ b/lib/librte_ring/rte_ring.h > @@ -457,7 +457,12 @@ __rte_ring_mp_do_enqueue(struct rte_ring *r, void * > const *obj_table, > > /* write entries in ring */ > ENQUEUE_PTRS(); > + > +#ifdef RTE_ARCH_STRONGLY_ORDERED_MEM_OPS > rte_compiler_barrier(); > +#else > + rte_wmb(); > +#endif > > /* if we exceed the watermark */ > if (unlikely(((mask + 1) - free_entries + n) > r->prod.watermark)) { > @@ -552,7 +557,12 @@ __rte_ring_sp_do_enqueue(struct rte_ring *r, void * > const *obj_table, > > /* write entries in ring */ > ENQUEUE_PTRS(); > + > +#ifdef RTE_ARCH_STRONGLY_ORDERED_MEM_OPS > rte_compiler_barrier(); > +#else > + rte_wmb(); > +#endif > > /* if we exceed the watermark */ > if (unlikely(((mask + 1) - free_entries + n) > r->prod.watermark)) { > @@ -643,7 +653,12 @@ __rte_ring_mc_do_dequeue(struct rte_ring *r, void > **obj_table, > > /* copy in table */ > DEQUEUE_PTRS(); > + > +#ifdef RTE_ARCH_STRONGLY_ORDERED_MEM_OPS > rte_compiler_barrier(); > +#else > + rte_rmb(); > +#endif > > /* > * If there are other dequeues in progress that preceded us, > @@ -727,7 +742,12 @@ __rte_ring_sc_do_dequeue(struct rte_ring *r, void > **obj_table, > > /* copy in table */ > DEQUEUE_PTRS(); > + > +#ifdef RTE_ARCH_STRONGLY_ORDERED_MEM_OPS > rte_compiler_barrier(); > +#else > + rte_rmb(); > +#endif > > __RING_STAT_ADD(r, deq_success, n); > r->cons.tail = cons_next;