Do bulk allocations to improve performance.

Signed-off-by: Andrew Boyer <andrew.bo...@amd.com>
---
 drivers/net/ionic/ionic_lif.h  |  6 ++++++
 drivers/net/ionic/ionic_rxtx.c | 35 ++++++++++++++++++++++++++--------
 2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ionic/ionic_lif.h b/drivers/net/ionic/ionic_lif.h
index 4fb1f213ff..5231909213 100644
--- a/drivers/net/ionic/ionic_lif.h
+++ b/drivers/net/ionic/ionic_lif.h
@@ -17,6 +17,8 @@
 #define IONIC_ADMINQ_LENGTH    16      /* must be a power of two */
 #define IONIC_NOTIFYQ_LENGTH   64      /* must be a power of two */
 
+#define IONIC_MBUF_BULK_ALLOC  64      /* Multiple of 4 */
+
 #define IONIC_RSS_OFFLOAD_ALL ( \
        IONIC_RSS_TYPE_IPV4 | \
        IONIC_RSS_TYPE_IPV4_TCP | \
@@ -86,9 +88,13 @@ struct ionic_rx_qcq {
        uint16_t hdr_seg_size;  /* Length of first segment of RX chain */
        uint16_t seg_size;      /* Length of all subsequent segments */
        uint16_t flags;
+       uint16_t mb_idx;
 
        /* cacheline3 (inside stats) */
        struct ionic_rx_stats stats;
+
+       /* cacheline4+ */
+       struct rte_mbuf *mbs[IONIC_MBUF_BULK_ALLOC] __rte_cache_aligned;
 };
 
 struct ionic_tx_qcq {
diff --git a/drivers/net/ionic/ionic_rxtx.c b/drivers/net/ionic/ionic_rxtx.c
index 30f7ce9fc6..5ee6573a50 100644
--- a/drivers/net/ionic/ionic_rxtx.c
+++ b/drivers/net/ionic/ionic_rxtx.c
@@ -77,6 +77,10 @@ ionic_rx_empty(struct ionic_rx_qcq *rxq)
         * fragments that were left dangling for later reuse
         */
        ionic_empty_array(q->info, q->num_descs * q->num_segs, 0);
+
+       ionic_empty_array((void **)rxq->mbs,
+                       IONIC_MBUF_BULK_ALLOC, rxq->mb_idx);
+       rxq->mb_idx = 0;
 }
 
 /*********************************************************************
@@ -950,6 +954,7 @@ ionic_rx_fill_one(struct ionic_rx_qcq *rxq)
        rte_iova_t data_iova;
        uint32_t i;
        void **info;
+       int ret;
 
        info = IONIC_INFO_PTR(q, q->head_idx);
        desc = &desc_base[q->head_idx];
@@ -959,12 +964,19 @@ ionic_rx_fill_one(struct ionic_rx_qcq *rxq)
        if (unlikely(info[0]))
                return 0;
 
-       rxm = rte_mbuf_raw_alloc(rxq->mb_pool);
-       if (unlikely(rxm == NULL)) {
-               assert(0);
-               return -ENOMEM;
+       if (rxq->mb_idx == 0) {
+               ret = rte_mempool_get_bulk(rxq->mb_pool,
+                                       (void **)rxq->mbs,
+                                       IONIC_MBUF_BULK_ALLOC);
+               if (ret) {
+                       assert(0);
+                       return -ENOMEM;
+               }
+
+               rxq->mb_idx = IONIC_MBUF_BULK_ALLOC;
        }
 
+       rxm = rxq->mbs[--rxq->mb_idx];
        info[0] = rxm;
 
        data_iova = rte_mbuf_data_iova_default(rxm);
@@ -975,12 +987,19 @@ ionic_rx_fill_one(struct ionic_rx_qcq *rxq)
                if (info[i])
                        return 0;
 
-               rxm_seg = rte_mbuf_raw_alloc(rxq->mb_pool);
-               if (rxm_seg == NULL) {
-                       assert(0);
-                       return -ENOMEM;
+               if (rxq->mb_idx == 0) {
+                       ret = rte_mempool_get_bulk(rxq->mb_pool,
+                                       (void **)rxq->mbs,
+                                       IONIC_MBUF_BULK_ALLOC);
+                       if (ret) {
+                               assert(0);
+                               return -ENOMEM;
+                       }
+
+                       rxq->mb_idx = IONIC_MBUF_BULK_ALLOC;
                }
 
+               rxm_seg = rxq->mbs[--rxq->mb_idx];
                info[i] = rxm_seg;
 
                /* The data_off does not get set to 0 until later */
-- 
2.17.1

Reply via email to