[PATCH 2/3] net/nfp: increase representor port rxq number

Chaoyong He chaoyong.he at corigine.com
Fri Aug 30 04:30:01 CEST 2024


From: Long Wu <long.wu at corigine.com>

This commit supports configuring multiple Rx queues for flower
representor port.

Signed-off-by: Long Wu <long.wu at corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he at corigine.com>
Reviewed-by: Peng Zhang <peng.zhang at corigine.com>
---
 drivers/net/nfp/flower/nfp_flower.c           |  8 ++--
 drivers/net/nfp/flower/nfp_flower.h           |  2 +-
 .../net/nfp/flower/nfp_flower_representor.c   | 40 +++++++++++++------
 .../net/nfp/flower/nfp_flower_representor.h   |  2 +-
 drivers/net/nfp/nfp_rxtx.c                    |  4 +-
 5 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c
index fa272790bc..8d781658ea 100644
--- a/drivers/net/nfp/flower/nfp_flower.c
+++ b/drivers/net/nfp/flower/nfp_flower.c
@@ -126,24 +126,24 @@ nfp_flower_get_repr(struct nfp_net_hw_priv *hw_priv,
 }
 
 bool
-nfp_flower_pf_dispatch_pkts(struct nfp_net_hw_priv *hw_priv,
+nfp_flower_pf_dispatch_pkts(struct nfp_net_rxq *rxq,
 		struct rte_mbuf *mbuf,
 		uint32_t port_id)
 {
 	struct nfp_flower_representor *repr;
 
-	repr = nfp_flower_get_repr(hw_priv, port_id);
+	repr = nfp_flower_get_repr(rxq->hw_priv, port_id);
 	if (repr == NULL) {
 		PMD_RX_LOG(ERR, "Can not get repr for port %u", port_id);
 		return false;
 	}
 
-	if (repr->ring == NULL) {
+	if (repr->ring == NULL || repr->ring[rxq->qidx] == NULL) {
 		PMD_RX_LOG(ERR, "No ring available for repr_port %s", repr->name);
 		return false;
 	}
 
-	if (rte_ring_enqueue(repr->ring, (void *)mbuf) != 0)
+	if (rte_ring_enqueue(repr->ring[rxq->qidx], (void *)mbuf) != 0)
 		return false;
 
 	return true;
diff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h
index b0d8fb0ed4..1dc868fb68 100644
--- a/drivers/net/nfp/flower/nfp_flower.h
+++ b/drivers/net/nfp/flower/nfp_flower.h
@@ -110,7 +110,7 @@ nfp_flower_support_decap_v2(const struct nfp_app_fw_flower *app_fw_flower)
 int nfp_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv);
 void nfp_uninit_app_fw_flower(struct nfp_net_hw_priv *hw_priv);
 int nfp_secondary_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv);
-bool nfp_flower_pf_dispatch_pkts(struct nfp_net_hw_priv *hw_priv,
+bool nfp_flower_pf_dispatch_pkts(struct nfp_net_rxq *rxq,
 		struct rte_mbuf *mbuf,
 		uint32_t port_id);
 uint16_t nfp_flower_pf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c
index 130795357d..96433b9f87 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -138,13 +138,14 @@ nfp_flower_repr_dev_stop(struct rte_eth_dev *dev)
 static int
 nfp_flower_repr_rx_queue_setup(struct rte_eth_dev *dev,
 		uint16_t rx_queue_id,
-		__rte_unused uint16_t nb_rx_desc,
+		uint16_t nb_rx_desc,
 		unsigned int socket_id,
 		__rte_unused const struct rte_eth_rxconf *rx_conf,
 		__rte_unused struct rte_mempool *mb_pool)
 {
 	struct nfp_net_rxq *rxq;
 	struct nfp_net_hw *pf_hw;
+	char ring_name[RTE_RING_NAMESIZE];
 	struct nfp_flower_representor *repr;
 
 	repr = dev->data->dev_private;
@@ -156,6 +157,15 @@ nfp_flower_repr_rx_queue_setup(struct rte_eth_dev *dev,
 	if (rxq == NULL)
 		return -ENOMEM;
 
+	snprintf(ring_name, sizeof(ring_name), "%s-%s-%u", repr->name, "Rx", rx_queue_id);
+	repr->ring[rx_queue_id] = rte_ring_create(ring_name, nb_rx_desc,
+			rte_socket_id(), 0);
+	if (repr->ring[rx_queue_id] == NULL) {
+		PMD_DRV_LOG(ERR, "rte_ring_create failed for rx queue %u", rx_queue_id);
+		rte_free(rxq);
+		return -ENOMEM;
+	}
+
 	rxq->hw = pf_hw;
 	rxq->qidx = rx_queue_id;
 	rxq->port_id = dev->data->port_id;
@@ -249,18 +259,18 @@ nfp_flower_repr_rx_burst(void *rx_queue,
 
 	dev = &rte_eth_devices[rxq->port_id];
 	repr = dev->data->dev_private;
-	if (unlikely(repr->ring == NULL)) {
+	if (unlikely(repr->ring == NULL) ||
+			unlikely(repr->ring[rxq->qidx] == NULL)) {
 		PMD_RX_LOG(ERR, "representor %s has no ring configured!",
 				repr->name);
 		return 0;
 	}
 
-	total_dequeue = rte_ring_dequeue_burst(repr->ring, (void *)rx_pkts,
-			nb_pkts, &available);
+	total_dequeue = rte_ring_dequeue_burst(repr->ring[rxq->qidx],
+			(void *)rx_pkts, nb_pkts, &available);
 	if (total_dequeue != 0) {
-		PMD_RX_LOG(DEBUG, "Representor Rx burst for %s, port_id: %#x, "
-				"received: %u, available: %u", repr->name,
-				repr->port_id, total_dequeue, available);
+		PMD_RX_LOG(DEBUG, "Port: %#x, queue: %hu received: %u, available: %u",
+				repr->port_id, rxq->qidx, total_dequeue, available);
 
 		data_len = 0;
 		for (i = 0; i < total_dequeue; i++)
@@ -328,12 +338,16 @@ static void
 nfp_flower_repr_free_queue(struct rte_eth_dev *eth_dev)
 {
 	uint16_t i;
+	struct nfp_flower_representor *repr;
 
 	for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
 		rte_free(eth_dev->data->tx_queues[i]);
 
-	for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
+		repr = eth_dev->data->dev_private;
+		rte_ring_free(repr->ring[i]);
 		rte_free(eth_dev->data->rx_queues[i]);
+	}
 }
 
 static void
@@ -378,7 +392,7 @@ nfp_flower_repr_uninit(struct rte_eth_dev *eth_dev)
 
 	repr = eth_dev->data->dev_private;
 	rte_free(repr->repr_xstats_base);
-	rte_ring_free(repr->ring);
+	rte_free(repr->ring);
 
 	if (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) {
 		index = NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(repr->port_id);
@@ -627,9 +641,11 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
 	 */
 	snprintf(ring_name, sizeof(ring_name), "%s_%s", init_repr_data->name, "ring");
 	numa_node = rte_socket_id();
-	repr->ring = rte_ring_create(ring_name, 256, numa_node, RING_F_SC_DEQ);
+	repr->ring = rte_zmalloc_socket(ring_name,
+			sizeof(struct rte_ring *) * app_fw_flower->pf_hw->max_rx_queues,
+			RTE_CACHE_LINE_SIZE, numa_node);
 	if (repr->ring == NULL) {
-		PMD_DRV_LOG(ERR, "rte_ring_create failed for %s", ring_name);
+		PMD_DRV_LOG(ERR, "Ring create failed for %s", ring_name);
 		return -ENOMEM;
 	}
 
@@ -704,7 +720,7 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
 mac_cleanup:
 	rte_free(eth_dev->data->mac_addrs);
 ring_cleanup:
-	rte_ring_free(repr->ring);
+	rte_free(repr->ring);
 
 	return ret;
 }
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.h b/drivers/net/nfp/flower/nfp_flower_representor.h
index c068c4462c..70ca7b97db 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.h
+++ b/drivers/net/nfp/flower/nfp_flower_representor.h
@@ -17,7 +17,7 @@ struct nfp_flower_representor {
 	char name[RTE_ETH_NAME_MAX_LEN];
 	struct rte_ether_addr mac_addr;
 	struct nfp_app_fw_flower *app_fw_flower;
-	struct rte_ring *ring;
+	struct rte_ring **ring;
 	struct rte_eth_link link;
 	struct rte_eth_stats repr_stats;
 
diff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c
index da41a0e663..05218537f7 100644
--- a/drivers/net/nfp/nfp_rxtx.c
+++ b/drivers/net/nfp/nfp_rxtx.c
@@ -419,7 +419,6 @@ nfp_net_recv_pkts(void *rx_queue,
 	struct nfp_net_dp_buf *rxb;
 	struct nfp_net_rx_desc *rxds;
 	uint16_t avail_multiplexed = 0;
-	struct nfp_net_hw_priv *hw_priv;
 
 	rxq = rx_queue;
 	if (unlikely(rxq == NULL)) {
@@ -432,7 +431,6 @@ nfp_net_recv_pkts(void *rx_queue,
 	}
 
 	hw = rxq->hw;
-	hw_priv = rxq->hw_priv;
 
 	while (avail + avail_multiplexed < nb_pkts) {
 		rxb = &rxq->rxbufs[rxq->rd_p];
@@ -523,7 +521,7 @@ nfp_net_recv_pkts(void *rx_queue,
 
 		if (((meta.flags >> NFP_NET_META_PORTID) & 0x1) == 0) {
 			rx_pkts[avail++] = mb;
-		} else if (nfp_flower_pf_dispatch_pkts(hw_priv, mb, meta.port_id)) {
+		} else if (nfp_flower_pf_dispatch_pkts(rxq, mb, meta.port_id)) {
 			avail_multiplexed++;
 		} else {
 			rte_pktmbuf_free(mb);
-- 
2.39.1



More information about the dev mailing list