> -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Stephen Hemminger > Sent: Friday, December 18, 2015 5:01 AM > To: Xie, Huawei > Cc: dev at dpdk.org > Subject: Re: [dpdk-dev] [PATCH v2 1/2] mbuf: provide rte_pktmbuf_alloc_bulk > API > > On Mon, 14 Dec 2015 09:14:41 +0800 > Huawei Xie <huawei.xie at intel.com> wrote: > > > v2 changes: > > unroll the loop a bit to help the performance > > > > rte_pktmbuf_alloc_bulk allocates a bulk of packet mbufs. > > > > There is related thread about this bulk API. > > http://dpdk.org/dev/patchwork/patch/4718/ > > Thanks to Konstantin's loop unrolling. > > > > Signed-off-by: Gerald Rogers <gerald.rogers at intel.com> > > Signed-off-by: Huawei Xie <huawei.xie at intel.com> > > Acked-by: Konstantin Ananyev <konstantin.ananyev at intel.com> > > --- > > lib/librte_mbuf/rte_mbuf.h | 50 > > ++++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 50 insertions(+) > > > > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h > > index f234ac9..4e209e0 100644 > > --- a/lib/librte_mbuf/rte_mbuf.h > > +++ b/lib/librte_mbuf/rte_mbuf.h > > @@ -1336,6 +1336,56 @@ static inline struct rte_mbuf > > *rte_pktmbuf_alloc(struct rte_mempool *mp) > > } > > > > /** > > + * Allocate a bulk of mbufs, initialize refcnt and reset the fields to > > default > > + * values. > > + * > > + * @param pool > > + * The mempool from which mbufs are allocated. > > + * @param mbufs > > + * Array of pointers to mbufs > > + * @param count > > + * Array size > > + * @return > > + * - 0: Success > > + */ > > +static inline int rte_pktmbuf_alloc_bulk(struct rte_mempool *pool, > > + struct rte_mbuf **mbufs, unsigned count) > > +{ > > + unsigned idx = 0; > > + int rc; > > + > > + rc = rte_mempool_get_bulk(pool, (void **)mbufs, count); > > + if (unlikely(rc)) > > + return rc; > > + > > + switch (count % 4) { > > + while (idx != count) { > > + case 0: > > + RTE_MBUF_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0); > > + rte_mbuf_refcnt_set(mbufs[idx], 1); > > + rte_pktmbuf_reset(mbufs[idx]); > > + idx++; > > + case 3: > > + RTE_MBUF_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0); > > + rte_mbuf_refcnt_set(mbufs[idx], 1); > > + rte_pktmbuf_reset(mbufs[idx]); > > + idx++; > > + case 2: > > + RTE_MBUF_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0); > > + rte_mbuf_refcnt_set(mbufs[idx], 1); > > + rte_pktmbuf_reset(mbufs[idx]); > > + idx++; > > + case 1: > > + RTE_MBUF_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0); > > + rte_mbuf_refcnt_set(mbufs[idx], 1); > > + rte_pktmbuf_reset(mbufs[idx]); > > + idx++; > > + } > > + } > > + return 0; > > +} > > This is weird. Why not just use Duff's device in a more normal manner.
But it is a sort of Duff's method. Not sure what looks weird to you here? while () {} instead of do {} while();? Konstantin