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.

Reply via email to