kni: optimize Rx burst
authorHemant Agrawal <Hemant@freescale.com>
Wed, 23 Jul 2014 06:45:12 +0000 (12:15 +0530)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 24 Feb 2015 01:26:24 +0000 (02:26 +0100)
The current implementation of rte_kni_rx_burst polls the fifo for buffers.
Irrespective of success or failure, it allocates the mbuf and try to put them into the alloc_q
if the buffers are not added to alloc_q, it frees them.
This waste lots of cpu cycles in allocating and freeing the buffers if alloc_q is full.

The logic has been changed to:
1. Initially allocand add buffer(burstsize) to alloc_q
2. Add buffers to alloc_q only when you are pulling out the buffers.

Signed-off-by: Hemant Agrawal <hemant@freescale.com>
Reviewed-by: Jay Rolette <rolette@infiniteio.com>
lib/librte_kni/rte_kni.c

index fdb7509..4e70fa0 100644 (file)
@@ -450,6 +450,9 @@ rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
 
        ctx->in_use = 1;
 
+       /* Allocate mbufs and then put them into alloc_q */
+       kni_allocate_mbufs(ctx);
+
        return ctx;
 
 kni_fail:
@@ -570,8 +573,9 @@ rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned num)
 {
        unsigned ret = kni_fifo_get(kni->tx_q, (void **)mbufs, num);
 
-       /* Allocate mbufs and then put them into alloc_q */
-       kni_allocate_mbufs(kni);
+       /* If buffers removed, allocate mbufs and then put them into alloc_q */
+       if (ret)
+               kni_allocate_mbufs(kni);
 
        return ret;
 }