DPDK patches and discussions
 help / color / mirror / Atom feed
From: Chaoyong He <chaoyong.he@corigine.com>
To: dev@dpdk.org
Cc: oss-drivers@corigine.com, Peng Zhang <peng.zhang@corigine.com>,
	Chaoyong He <chaoyong.he@corigine.com>,
	Long Wu <long.wu@corigine.com>
Subject: [PATCH 9/9] net/nfp: update the Tx and Rx function for multiple PF
Date: Mon, 21 Oct 2024 14:33:01 +0800	[thread overview]
Message-ID: <20241021063301.4146214-10-chaoyong.he@corigine.com> (raw)
In-Reply-To: <20241021063301.4146214-1-chaoyong.he@corigine.com>

From: Peng Zhang <peng.zhang@corigine.com>

Update the Tx function and Rx function for multiple PF and simplify the
Rx function to enhance the performance.
In the RX function, the packets are processed according the firmware type.

Signed-off-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
---
 drivers/net/nfp/flower/nfp_flower.c           | 70 +++++++++++++++++++
 drivers/net/nfp/flower/nfp_flower.h           |  6 ++
 drivers/net/nfp/flower/nfp_flower_cmsg.h      |  7 ++
 .../net/nfp/flower/nfp_flower_representor.c   |  4 +-
 drivers/net/nfp/nfp_ethdev.c                  |  6 ++
 drivers/net/nfp/nfp_ethdev_vf.c               |  6 ++
 drivers/net/nfp/nfp_net_common.c              | 48 +++++++++++++
 drivers/net/nfp/nfp_net_common.h              |  4 ++
 drivers/net/nfp/nfp_rxtx.c                    | 14 ++--
 9 files changed, 158 insertions(+), 7 deletions(-)

diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c
index df7a150a99..f087d0dfdc 100644
--- a/drivers/net/nfp/flower/nfp_flower.c
+++ b/drivers/net/nfp/flower/nfp_flower.c
@@ -215,6 +215,76 @@ nfp_flower_pf_xmit_pkts(void *tx_queue,
 	return app_fw_flower->nfd_func.pf_xmit_t(tx_queue, tx_pkts, nb_pkts);
 }
 
+uint16_t
+nfp_flower_multiple_pf_recv_pkts(void *rx_queue,
+		struct rte_mbuf **rx_pkts,
+		uint16_t nb_pkts)
+{
+	int i;
+	uint16_t recv;
+	uint32_t data_len;
+	struct nfp_net_rxq *rxq;
+	struct rte_eth_dev *repr_dev;
+	struct nfp_flower_representor *repr;
+
+	recv = nfp_net_recv_pkts(rx_queue, rx_pkts, nb_pkts);
+	if (recv != 0) {
+		/* Grab a handle to the representor struct */
+		rxq = rx_queue;
+		repr_dev = &rte_eth_devices[rxq->port_id];
+		repr = repr_dev->data->dev_private;
+
+		data_len = 0;
+		for (i = 0; i < recv; i++)
+			data_len += rx_pkts[i]->data_len;
+
+		repr->repr_stats.ipackets += recv;
+		repr->repr_stats.q_ipackets[rxq->qidx] += recv;
+		repr->repr_stats.q_ibytes[rxq->qidx] += data_len;
+	}
+
+	return recv;
+}
+
+uint16_t
+nfp_flower_multiple_pf_xmit_pkts(void *tx_queue,
+		struct rte_mbuf **tx_pkts,
+		uint16_t nb_pkts)
+{
+	int i;
+	uint16_t sent;
+	uint32_t data_len;
+	struct nfp_net_txq *txq;
+	struct rte_eth_dev *repr_dev;
+	struct nfp_flower_representor *repr;
+
+	txq = tx_queue;
+	if (unlikely(txq == NULL)) {
+		PMD_TX_LOG(ERR, "TX Bad queue.");
+		return 0;
+	}
+
+	/* Grab a handle to the representor struct */
+	repr_dev = &rte_eth_devices[txq->port_id];
+	repr = repr_dev->data->dev_private;
+	for (i = 0; i < nb_pkts; i++)
+		nfp_flower_pkt_add_metadata(repr->app_fw_flower,
+				tx_pkts[i], repr->port_id);
+
+	sent = nfp_flower_pf_xmit_pkts(tx_queue, tx_pkts, nb_pkts);
+	if (sent != 0) {
+		data_len = 0;
+		for (i = 0; i < sent; i++)
+			data_len += tx_pkts[i]->data_len;
+
+		repr->repr_stats.opackets += sent;
+		repr->repr_stats.q_opackets[txq->qidx] += sent;
+		repr->repr_stats.q_obytes[txq->qidx] += data_len;
+	}
+
+	return sent;
+}
+
 static int
 nfp_flower_init_vnic_common(struct nfp_net_hw_priv *hw_priv,
 		struct nfp_net_hw *hw,
diff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h
index a257366656..7b919a939b 100644
--- a/drivers/net/nfp/flower/nfp_flower.h
+++ b/drivers/net/nfp/flower/nfp_flower.h
@@ -115,6 +115,12 @@ bool nfp_flower_pf_dispatch_pkts(struct nfp_net_rxq *rxq,
 		uint32_t port_id);
 uint16_t nfp_flower_pf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 		uint16_t nb_pkts);
+uint16_t nfp_flower_multiple_pf_xmit_pkts(void *tx_queue,
+		struct rte_mbuf **tx_pkts,
+		uint16_t nb_pkts);
+uint16_t nfp_flower_multiple_pf_recv_pkts(void *rx_queue,
+		struct rte_mbuf **tx_pkts,
+		uint16_t nb_pkts);
 int nfp_flower_pf_start(struct rte_eth_dev *dev);
 int nfp_flower_pf_stop(struct rte_eth_dev *dev);
 uint32_t nfp_flower_pkt_add_metadata(struct nfp_app_fw_flower *app_fw_flower,
diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h b/drivers/net/nfp/flower/nfp_flower_cmsg.h
index eda047a404..a7866e8382 100644
--- a/drivers/net/nfp/flower/nfp_flower_cmsg.h
+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h
@@ -1045,4 +1045,11 @@ int nfp_flower_cmsg_qos_delete(struct nfp_app_fw_flower *app_fw_flower,
 int nfp_flower_cmsg_qos_stats(struct nfp_app_fw_flower *app_fw_flower,
 		struct nfp_cfg_head *head);
 
+static inline bool
+nfp_flower_port_is_phy_port(uint32_t port_id)
+{
+	return (NFP_FLOWER_CMSG_PORT_TYPE(port_id) ==
+			NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT);
+}
+
 #endif /* __NFP_CMSG_H__ */
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c
index 6e957b125f..1f1b462b41 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -815,8 +815,8 @@ nfp_flower_multiple_pf_repr_init(struct rte_eth_dev *eth_dev,
 	hw_priv = repr_init->hw_priv;
 
 	eth_dev->dev_ops = &nfp_flower_multiple_pf_repr_dev_ops;
-	eth_dev->rx_pkt_burst = nfp_net_recv_pkts;
-	eth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;
+	eth_dev->rx_pkt_burst = nfp_flower_multiple_pf_recv_pkts;
+	eth_dev->tx_pkt_burst = nfp_flower_multiple_pf_xmit_pkts;
 	eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |
 			RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index c261e575bc..b41dbee4ff 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -2530,6 +2530,12 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 
 	hw_priv->is_pf = true;
 
+	if (!nfp_net_recv_pkt_meta_check_register(hw_priv)) {
+		PMD_INIT_LOG(ERR, "PF register meta check function failed.");
+		ret = -EIO;
+		goto hw_priv_free;
+	}
+
 	/*
 	 * PF initialization has been done at this point. Call app specific
 	 * init code now.
diff --git a/drivers/net/nfp/nfp_ethdev_vf.c b/drivers/net/nfp/nfp_ethdev_vf.c
index 4941c915e7..36b98dc0c2 100644
--- a/drivers/net/nfp/nfp_ethdev_vf.c
+++ b/drivers/net/nfp/nfp_ethdev_vf.c
@@ -316,6 +316,12 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev)
 	hw_priv->dev_info = dev_info;
 	hw_priv->pf_dev = pf_dev;
 
+	if (!nfp_net_recv_pkt_meta_check_register(hw_priv)) {
+		PMD_INIT_LOG(ERR, "VF register meta check function failed.");
+		err = -EINVAL;
+		goto hw_priv_free;
+	}
+
 	eth_dev->process_private = hw_priv;
 
 	/* For secondary processes, the primary has done all the work */
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index ccfb4b39f1..4ad6c532ee 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -9,6 +9,7 @@
 
 #include <rte_alarm.h>
 
+#include "flower/nfp_flower_cmsg.h"
 #include "flower/nfp_flower_representor.h"
 #include "nfd3/nfp_nfd3.h"
 #include "nfdk/nfp_nfdk.h"
@@ -2877,3 +2878,50 @@ nfp_net_vf_config_app_init(struct nfp_net_hw *net_hw,
 
 	return 0;
 }
+
+static inline bool
+nfp_net_meta_has_no_port_type(__rte_unused struct nfp_net_meta_parsed *meta)
+{
+	return true;
+}
+
+static inline bool
+nfp_net_meta_is_not_pf_port(__rte_unused struct nfp_net_meta_parsed *meta)
+{
+	return false;
+}
+
+static inline bool
+nfp_net_meta_is_pf_port(struct nfp_net_meta_parsed *meta)
+{
+	return nfp_flower_port_is_phy_port(meta->port_id);
+}
+
+bool
+nfp_net_recv_pkt_meta_check_register(struct nfp_net_hw_priv *hw_priv)
+{
+	struct nfp_pf_dev *pf_dev;
+
+	pf_dev = hw_priv->pf_dev;
+	if (!hw_priv->is_pf) {
+		pf_dev->recv_pkt_meta_check_t = nfp_net_meta_has_no_port_type;
+		return true;
+	}
+
+	switch (pf_dev->app_fw_id) {
+	case NFP_APP_FW_CORE_NIC:
+		pf_dev->recv_pkt_meta_check_t = nfp_net_meta_has_no_port_type;
+		break;
+	case NFP_APP_FW_FLOWER_NIC:
+		if (pf_dev->multi_pf.enabled)
+			pf_dev->recv_pkt_meta_check_t = nfp_net_meta_is_pf_port;
+		else
+			pf_dev->recv_pkt_meta_check_t = nfp_net_meta_is_not_pf_port;
+		break;
+	default:
+		PMD_INIT_LOG(ERR, "Unsupported Firmware loaded.");
+		return false;
+	}
+
+	return true;
+}
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index 64b8a38918..a9581827f9 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -169,6 +169,9 @@ struct nfp_pf_dev {
 
 	/** Record the speed uptade */
 	bool speed_updated;
+
+	/** Function pointer used to check the metadata of recv pkts. */
+	bool (*recv_pkt_meta_check_t)(struct nfp_net_meta_parsed *meta);
 };
 
 #define NFP_NET_ETH_FLOW_LIMIT    8
@@ -389,6 +392,7 @@ bool nfp_net_version_check(struct nfp_hw *hw,
 void nfp_net_ctrl_bar_size_set(struct nfp_pf_dev *pf_dev);
 void nfp_net_notify_port_speed(struct nfp_net_hw *hw,
 		struct rte_eth_link *link);
+bool nfp_net_recv_pkt_meta_check_register(struct nfp_net_hw_priv *hw_priv);
 
 #define NFP_PRIV_TO_APP_FW_NIC(app_fw_priv)\
 	((struct nfp_app_fw_nic *)app_fw_priv)
diff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c
index c7812a6dee..35fb637b21 100644
--- a/drivers/net/nfp/nfp_rxtx.c
+++ b/drivers/net/nfp/nfp_rxtx.c
@@ -416,6 +416,7 @@ nfp_net_recv_pkts(void *rx_queue,
 	struct nfp_net_hw *hw;
 	struct rte_mbuf *new_mb;
 	struct nfp_net_rxq *rxq;
+	struct nfp_pf_dev *pf_dev;
 	struct nfp_net_dp_buf *rxb;
 	struct nfp_net_rx_desc *rxds;
 	uint16_t avail_multiplexed = 0;
@@ -431,6 +432,7 @@ nfp_net_recv_pkts(void *rx_queue,
 	}
 
 	hw = rxq->hw;
+	pf_dev = rxq->hw_priv->pf_dev;
 
 	while (avail + avail_multiplexed < nb_pkts) {
 		rxb = &rxq->rxbufs[rxq->rd_p];
@@ -519,13 +521,15 @@ nfp_net_recv_pkts(void *rx_queue,
 		if (unlikely(rxq->rd_p == rxq->rx_count)) /* Wrapping */
 			rxq->rd_p = 0;
 
-		if (((meta.flags >> NFP_NET_META_PORTID) & 0x1) == 0) {
+		if (pf_dev->recv_pkt_meta_check_t(&meta)) {
 			rx_pkts[avail++] = mb;
-		} else if (nfp_flower_pf_dispatch_pkts(rxq, mb, meta.port_id)) {
-			avail_multiplexed++;
 		} else {
-			rte_pktmbuf_free(mb);
-			break;
+			if (nfp_flower_pf_dispatch_pkts(rxq, mb, meta.port_id)) {
+				avail_multiplexed++;
+			} else {
+				rte_pktmbuf_free(mb);
+				break;
+			}
 		}
 	}
 
-- 
2.39.1


      parent reply	other threads:[~2024-10-21  6:34 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-21  6:32 [PATCH 0/9] support multiple PF flower firmware Chaoyong He
2024-10-21  6:32 ` [PATCH 1/9] net/nfp: extract the function to allocate the PHY Chaoyong He
2024-10-21  6:32 ` [PATCH 2/9] net/nfp: extract the function to initialize the PF Chaoyong He
2024-10-21  6:32 ` [PATCH 3/9] net/nfp: extract the function to allocate PF Chaoyong He
2024-10-21  6:32 ` [PATCH 4/9] net/nfp: extract the function to allocate the VF Chaoyong He
2024-10-21  6:32 ` [PATCH 5/9] net/nfp: revise the number of PF representor port Chaoyong He
2024-10-21  6:32 ` [PATCH 6/9] net/nfp: initialize the representor port of the multiple PF Chaoyong He
2024-10-21  6:32 ` [PATCH 7/9] net/nfp: ignore useless message for " Chaoyong He
2024-10-21  6:33 ` [PATCH 8/9] net/nfp: add the new operations " Chaoyong He
2024-10-21  6:33 ` Chaoyong He [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241021063301.4146214-10-chaoyong.he@corigine.com \
    --to=chaoyong.he@corigine.com \
    --cc=dev@dpdk.org \
    --cc=long.wu@corigine.com \
    --cc=oss-drivers@corigine.com \
    --cc=peng.zhang@corigine.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).