net/bnxt: fix memory leak during queue restart
[dpdk.git] / drivers / net / bnxt / bnxt_rxr.c
index 40da2f2..a657150 100644 (file)
@@ -963,14 +963,16 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq)
 
        prod = rxr->rx_prod;
        for (i = 0; i < ring->ring_size; i++) {
-               if (bnxt_alloc_rx_data(rxq, rxr, prod) != 0) {
-                       PMD_DRV_LOG(WARNING,
-                               "init'ed rx ring %d with %d/%d mbufs only\n",
-                               rxq->queue_id, i, ring->ring_size);
-                       break;
+               if (unlikely(!rxr->rx_buf_ring[i].mbuf)) {
+                       if (bnxt_alloc_rx_data(rxq, rxr, prod) != 0) {
+                               PMD_DRV_LOG(WARNING,
+                                           "init'ed rx ring %d with %d/%d mbufs only\n",
+                                           rxq->queue_id, i, ring->ring_size);
+                               break;
+                       }
+                       rxr->rx_prod = prod;
+                       prod = RING_NEXT(rxr->rx_ring_struct, prod);
                }
-               rxr->rx_prod = prod;
-               prod = RING_NEXT(rxr->rx_ring_struct, prod);
        }
 
        ring = rxr->ag_ring_struct;
@@ -979,14 +981,16 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq)
        prod = rxr->ag_prod;
 
        for (i = 0; i < ring->ring_size; i++) {
-               if (bnxt_alloc_ag_data(rxq, rxr, prod) != 0) {
-                       PMD_DRV_LOG(WARNING,
-                       "init'ed AG ring %d with %d/%d mbufs only\n",
-                       rxq->queue_id, i, ring->ring_size);
-                       break;
+               if (unlikely(!rxr->ag_buf_ring[i].mbuf)) {
+                       if (bnxt_alloc_ag_data(rxq, rxr, prod) != 0) {
+                               PMD_DRV_LOG(WARNING,
+                                           "init'ed AG ring %d with %d/%d mbufs only\n",
+                                           rxq->queue_id, i, ring->ring_size);
+                               break;
+                       }
+                       rxr->ag_prod = prod;
+                       prod = RING_NEXT(rxr->ag_ring_struct, prod);
                }
-               rxr->ag_prod = prod;
-               prod = RING_NEXT(rxr->ag_ring_struct, prod);
        }
        PMD_DRV_LOG(DEBUG, "AGG Done!\n");
 
@@ -994,11 +998,13 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq)
                unsigned int max_aggs = BNXT_TPA_MAX_AGGS(rxq->bp);
 
                for (i = 0; i < max_aggs; i++) {
-                       rxr->tpa_info[i].mbuf =
-                               __bnxt_alloc_rx_data(rxq->mb_pool);
-                       if (!rxr->tpa_info[i].mbuf) {
-                               rte_atomic64_inc(&rxq->rx_mbuf_alloc_fail);
-                               return -ENOMEM;
+                       if (unlikely(!rxr->tpa_info[i].mbuf)) {
+                               rxr->tpa_info[i].mbuf =
+                                       __bnxt_alloc_rx_data(rxq->mb_pool);
+                               if (!rxr->tpa_info[i].mbuf) {
+                                       rte_atomic64_inc(&rxq->rx_mbuf_alloc_fail);
+                                       return -ENOMEM;
+                               }
                        }
                }
        }