[dpdk-dev] [PATCH 22/25] net/bnxt: fix bugs in representor data path

Ajit Khaparde ajit.khaparde at broadcom.com
Fri Sep 11 03:56:00 CEST 2020


From: Somnath Kotur <somnath.kotur at broadcom.com>

1.Representor Rx ring producer index was not getting reset in
the ring full case. Fix it by incrementing only in
success case.
2.Instead of calling the mbuf specific routine to free the mbuf when
representor ring is full rte_free was being called leading to
'invalid memory' errors being logged.
3. Do not account the pkt meant for the representor in the parent
Rx ring's array that is returned to the application.

Fixes: 6dc83230b43b ("net/bnxt: support port representor data path")

Signed-off-by: Somnath Kotur <somnath.kotur at broadcom.com>
Reviewed-by: Sriharsha Basavapatna <sriharsha.basavapatna at broadcom.com>
Reviewed-by: Venkat Duvvuru <venkatkumar.duvvuru at broadcom.com>
---
 drivers/net/bnxt/bnxt_reps.c |  7 ++++---
 drivers/net/bnxt/bnxt_rxr.c  | 27 +++++++++++++--------------
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
index 9d5fa7394..fd111bec5 100644
--- a/drivers/net/bnxt/bnxt_reps.c
+++ b/drivers/net/bnxt/bnxt_reps.c
@@ -55,16 +55,17 @@ bnxt_vfr_recv(uint16_t port_id, uint16_t queue_id, struct rte_mbuf *mbuf)
 	mask = rep_rxr->rx_ring_struct->ring_mask;
 
 	/* Put this mbuf on the RxQ of the Representor */
-	prod_rx_buf =
-		&rep_rxr->rx_buf_ring[rep_rxr->rx_prod++ & mask];
+	prod_rx_buf = &rep_rxr->rx_buf_ring[rep_rxr->rx_prod & mask];
 	if (!prod_rx_buf->mbuf) {
 		prod_rx_buf->mbuf = mbuf;
 		vfr_bp->rx_bytes[que] += mbuf->pkt_len;
 		vfr_bp->rx_pkts[que]++;
+		rep_rxr->rx_prod++;
 	} else {
+		/* Representor Rx ring full, drop pkt */
 		vfr_bp->rx_drop_bytes[que] += mbuf->pkt_len;
 		vfr_bp->rx_drop_pkts[que]++;
-		rte_pktmbuf_free(mbuf); /* Representor Rx ring full, drop pkt */
+		rte_pktmbuf_free(mbuf);
 	}
 
 	return 0;
diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index b08689814..5bfe62a2a 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -733,6 +733,19 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 		goto rx;
 	}
 	rxr->rx_prod = prod;
+
+	if (BNXT_TRUFLOW_EN(bp) && (BNXT_VF_IS_TRUSTED(bp) || BNXT_PF(bp)) &&
+	    vfr_flag) {
+		bnxt_vfr_recv(mark_id, rxq->queue_id, mbuf);
+		/* Now return an error so that nb_rx_pkts is not
+		 * incremented.
+		 * This packet was meant to be given to the representor.
+		 * So no need to account the packet and give it to
+		 * parent Rx burst function.
+		 */
+		rc = -ENODEV;
+		goto next_rx;
+	}
 	/*
 	 * All MBUFs are allocated with the same size under DPDK,
 	 * no optimization for rx_copy_thresh
@@ -740,20 +753,6 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 rx:
 	*rx_pkt = mbuf;
 
-	if (BNXT_TRUFLOW_EN(bp) &&
-	    (BNXT_VF_IS_TRUSTED(bp) || BNXT_PF(bp)) &&
-	    vfr_flag) {
-		if (!bnxt_vfr_recv(mark_id, rxq->queue_id, mbuf)) {
-			/* Now return an error so that nb_rx_pkts is not
-			 * incremented.
-			 * This packet was meant to be given to the representor.
-			 * So no need to account the packet and give it to
-			 * parent Rx burst function.
-			 */
-			rc = -ENODEV;
-		}
-	}
-
 next_rx:
 
 	*raw_cons = tmp_raw_cons;
-- 
2.21.1 (Apple Git-122.3)



More information about the dev mailing list