On 12/18/2015 1:03 PM, Stephen Hemminger wrote:
> 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.
Hi Stephen: I just compared with duff's unrolled version. It is slightly
different, but where is weird?
>
>