Hi Neil, 2014-09-18 11:03, Neil Horman: > Thank you, I've reproduced the problem here, and you're right, it is a > compiler bug, but I really hate the idea of just throwing braces around > something to shut the compiler up, especially when the compiler has since > been fixed. Looking at it a bit more closely it seems like the the thing > to do is actually just consistently use rte_mbuf_refcnt_set, since thats > what the rte_mbuf header documentation says to do, and protects you if the > internal structure changes, as well as prevents you from having to spread > ifdef RTE_MBUF_REFCNT all over the place. > > This patch does a bit more than that too. With a little creative > typedef-ing we don't need the anonymous union at all, and lets us just use > a single refcnt variable, and I think eliminate that odd refcnt_reserved > member of the union, that, as far as I can see, does nothing.
> --- a/config/common_linuxapp > +++ b/config/common_linuxapp > @@ -123,7 +123,7 @@ CONFIG_RTE_LOG_HISTORY=256 > CONFIG_RTE_LIBEAL_USE_HPET=n > CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID=n > CONFIG_RTE_EAL_ALWAYS_PANIC_ON_ERROR=n > -CONFIG_RTE_EAL_IGB_UIO=y > +CONFIG_RTE_EAL_IGB_UIO=n > CONFIG_RTE_EAL_VFIO=y Hum, indeed this patch does a bit more ;) [...] > -CONFIG_RTE_LIBRTE_KNI=y > +CONFIG_RTE_LIBRTE_KNI=n > CONFIG_RTE_KNI_KO_DEBUG=n > --- a/lib/librte_mbuf/rte_mbuf.h > +++ b/lib/librte_mbuf/rte_mbuf.h > @@ -120,6 +120,15 @@ extern "C" { > typedef void *MARKER[0]; /**< generic marker for a point in a > structure */ typedef uint64_t MARKER64[0]; /**< marker that allows us to > overwrite 8 bytes * with a single assignment */ > + > +#ifdef RTE_MBUF_REFCNT > +#ifdef RTE_MBUF_REFCNT_ATOMIC > +typedef rte_atomic16_t rte_refcnt; > +#else > +typedef uint16_t rte_refcnt; > +#endif > +#endif > + > /** > * The generic rte_mbuf, containing a packet mbuf. > */ > @@ -142,13 +151,9 @@ struct rte_mbuf { > * or non-atomic) is controlled by the CONFIG_RTE_MBUF_REFCNT_ATOMIC > * config option. > */ > - union { > #ifdef RTE_MBUF_REFCNT > - rte_atomic16_t refcnt_atomic; /**< Atomically accessed refcnt */ > - uint16_t refcnt; /**< Non-atomically accessed > refcnt */ > + rte_refcnt refcnt; > #endif > - uint16_t refcnt_reserved; /**< Do not use this field */ > - }; You are changing the mbuf alignment if MBUF_REFCNT is disabled. > --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx_vec.c > +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx_vec.c > @@ -722,11 +722,9 @@ ixgbe_rxq_vec_setup(struct igb_rx_queue *rxq) > static struct rte_mbuf mb_def = { > .nb_segs = 1, > .data_off = RTE_PKTMBUF_HEADROOM, > -#ifdef RTE_MBUF_REFCNT > - { .refcnt = 1, } > -#endif > }; > > + rte_mbuf_refcnt_set(&mb_def, 1); Performance impact must be checked here. -- Thomas