The PROD/CONS_ALIGN values on x86-64 are set to 2 cache lines, so members of 
struct rte_ring are 128 byte aligned, and therefore the whole struct needs 
128-byte alignment according to the ABI so that the 128-byte alignment of the 
fields can be guaranteed.

If the allocation is only 64-byte aligned, the beginning of the prod and cons 
fields may not actually be 128-byte aligned (but we've told the compiler that 
they are using the __rte_aligned macro).  Accessing these fields when they are 
misaligned will work in practice on x86 (as long as the compiler doesn't use 
e.g. aligned SSE instructions), but it is undefined behavior according to the C 
standard, and UBSan (-fsanitize=undefined) checks for this.

Thanks,
-- Daniel Verkamp

> -----Original Message-----
> From: Ananyev, Konstantin
> Sent: Friday, June 2, 2017 1:52 PM
> To: Verkamp, Daniel <daniel.verk...@intel.com>; dev@dpdk.org
> Cc: Verkamp, Daniel <daniel.verk...@intel.com>
> Subject: RE: [dpdk-dev] [PATCH v2] ring: use aligned memzone allocation
> 
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Daniel Verkamp
> > Sent: Friday, June 2, 2017 9:12 PM
> > To: dev@dpdk.org
> > Cc: Verkamp, Daniel <daniel.verk...@intel.com>
> > Subject: [dpdk-dev] [PATCH v2] ring: use aligned memzone allocation
> >
> > rte_memzone_reserve() provides cache line alignment, but
> > struct rte_ring may require more than cache line alignment: on x86-64,
> > it needs 128-byte alignment due to PROD_ALIGN and CONS_ALIGN, which are
> > 128 bytes, but cache line size is 64 bytes.
> 
> Hmm but what for?
> I understand we need our rte_ring cche-line aligned,
> but why do you want it 2 cache-line aligned?
> Konstantin
> 
> >
> > Fixes runtime warnings with UBSan enabled.
> >
> > Fixes: d9f0d3a1ffd4 ("ring: remove split cacheline build setting")
> >
> > Signed-off-by: Daniel Verkamp <daniel.verk...@intel.com>
> > ---
> >
> > v2: fixed checkpatch warnings
> >
> >  lib/librte_ring/rte_ring.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/lib/librte_ring/rte_ring.c b/lib/librte_ring/rte_ring.c
> > index 5f98c33..6f58faf 100644
> > --- a/lib/librte_ring/rte_ring.c
> > +++ b/lib/librte_ring/rte_ring.c
> > @@ -189,7 +189,8 @@ rte_ring_create(const char *name, unsigned count, int
> socket_id,
> >     /* reserve a memory zone for this ring. If we can't get rte_config or
> >      * we are secondary process, the memzone_reserve function will set
> >      * rte_errno for us appropriately - hence no check in this this 
> > function */
> > -   mz = rte_memzone_reserve(mz_name, ring_size, socket_id, mz_flags);
> > +   mz = rte_memzone_reserve_aligned(mz_name, ring_size, socket_id,
> > +                                    mz_flags, __alignof__(*r));
> >     if (mz != NULL) {
> >             r = mz->addr;
> >             /* no need to check return value here, we already checked the
> > --
> > 2.9.4

Reply via email to