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, Chaoyong He <chaoyong.he@corigine.com>,
	Long Wu <long.wu@corigine.com>,
	Peng Zhang <peng.zhang@corigine.com>
Subject: [PATCH 2/2] net/nfp: add support of xstats for flower firmware
Date: Thu, 23 May 2024 10:49:16 +0800	[thread overview]
Message-ID: <20240523024916.2291031-3-chaoyong.he@corigine.com> (raw)
In-Reply-To: <20240523024916.2291031-1-chaoyong.he@corigine.com>

Add support the extend stats for flower firmware, include the stats for
each queue.

Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
---
 .../net/nfp/flower/nfp_flower_representor.c   | 47 ++++++++++++++-
 .../net/nfp/flower/nfp_flower_representor.h   |  4 ++
 drivers/net/nfp/nfp_net_common.c              | 58 +++++++++++++++----
 3 files changed, 96 insertions(+), 13 deletions(-)

diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c
index f9001ab1f0..f1451fcca2 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -199,7 +199,7 @@ nfp_flower_repr_stats_get(struct rte_eth_dev *ethdev,
 	return 0;
 }
 
-static int
+int
 nfp_flower_repr_stats_reset(struct rte_eth_dev *ethdev)
 {
 	struct nfp_flower_representor *repr;
@@ -228,6 +228,8 @@ nfp_flower_repr_rx_burst(void *rx_queue,
 		struct rte_mbuf **rx_pkts,
 		uint16_t nb_pkts)
 {
+	uint32_t i;
+	uint32_t data_len;
 	unsigned int available = 0;
 	unsigned int total_dequeue;
 	struct nfp_net_rxq *rxq;
@@ -255,7 +257,13 @@ nfp_flower_repr_rx_burst(void *rx_queue,
 				"received: %u, available: %u", repr->name,
 				repr->port_id, total_dequeue, available);
 
+		data_len = 0;
+		for (i = 0; i < total_dequeue; i++)
+			data_len += rx_pkts[i]->data_len;
+
 		repr->repr_stats.ipackets += total_dequeue;
+		repr->repr_stats.q_ipackets[rxq->qidx] += total_dequeue;
+		repr->repr_stats.q_ibytes[rxq->qidx] += data_len;
 	}
 
 	return total_dequeue;
@@ -268,6 +276,7 @@ nfp_flower_repr_tx_burst(void *tx_queue,
 {
 	uint16_t i;
 	uint16_t sent;
+	uint32_t data_len;
 	void *pf_tx_queue;
 	struct nfp_net_txq *txq;
 	struct rte_eth_dev *dev;
@@ -297,7 +306,14 @@ nfp_flower_repr_tx_burst(void *tx_queue,
 	if (sent != 0) {
 		PMD_TX_LOG(DEBUG, "Representor Tx burst for %s, port_id: %#x transmitted: %hu",
 				repr->name, repr->port_id, sent);
+
+		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;
@@ -356,6 +372,7 @@ nfp_flower_repr_uninit(struct rte_eth_dev *eth_dev)
 	struct nfp_flower_representor *repr;
 
 	repr = eth_dev->data->dev_private;
+	rte_free(repr->repr_xstats_base);
 	rte_ring_free(repr->ring);
 
 	if (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) {
@@ -497,6 +514,12 @@ static const struct eth_dev_ops nfp_flower_repr_dev_ops = {
 
 	.flow_ops_get         = nfp_flow_ops_get,
 	.mtr_ops_get          = nfp_net_mtr_ops_get,
+
+	.xstats_get             = nfp_net_xstats_get,
+	.xstats_reset           = nfp_net_xstats_reset,
+	.xstats_get_names       = nfp_net_xstats_get_names,
+	.xstats_get_by_id       = nfp_net_xstats_get_by_id,
+	.xstats_get_names_by_id = nfp_net_xstats_get_names_by_id,
 };
 
 static uint32_t
@@ -548,7 +571,8 @@ nfp_flower_pf_repr_init(struct rte_eth_dev *eth_dev,
 	eth_dev->dev_ops = &nfp_flower_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->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
+	eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |
+			RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
 	eth_dev->data->representor_id = 0;
 
@@ -582,6 +606,7 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
 	int ret;
 	uint16_t index;
 	unsigned int numa_node;
+	struct nfp_net_hw_priv *hw_priv;
 	char ring_name[RTE_ETH_NAME_MAX_LEN];
 	struct nfp_app_fw_flower *app_fw_flower;
 	struct nfp_flower_representor *repr;
@@ -593,6 +618,7 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
 
 	/* Memory has been allocated in the eth_dev_create() function */
 	repr = eth_dev->data->dev_private;
+	hw_priv = eth_dev->process_private;
 
 	/*
 	 * We need multiproduce rings as we can have multiple PF ports.
@@ -620,7 +646,8 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
 	eth_dev->dev_ops = &nfp_flower_repr_dev_ops;
 	eth_dev->rx_pkt_burst = nfp_flower_repr_rx_burst;
 	eth_dev->tx_pkt_burst = nfp_flower_repr_tx_burst;
-	eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
+	eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |
+			RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
 	if (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT)
 		eth_dev->data->representor_id = repr->vf_id;
@@ -662,6 +689,20 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
 		app_fw_flower->vf_reprs[index] = repr;
 	}
 
+	if (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) {
+		repr->mac_stats = hw_priv->pf_dev->mac_stats_bar +
+				(repr->nfp_idx * NFP_MAC_STATS_SIZE);
+	}
+
+	/* Allocate memory for extended statistics counters */
+	repr->repr_xstats_base = rte_zmalloc("rte_eth_xstat",
+			sizeof(struct rte_eth_xstat) * nfp_net_xstats_size(eth_dev), 0);
+	if (repr->repr_xstats_base == NULL) {
+		PMD_INIT_LOG(ERR, "No memory for xstats base on device %s!", repr->name);
+		ret = -ENOMEM;
+		goto mac_cleanup;
+	}
+
 	return 0;
 
 mac_cleanup:
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.h b/drivers/net/nfp/flower/nfp_flower_representor.h
index d539e53b23..c068c4462c 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.h
+++ b/drivers/net/nfp/flower/nfp_flower_representor.h
@@ -20,10 +20,14 @@ struct nfp_flower_representor {
 	struct rte_ring *ring;
 	struct rte_eth_link link;
 	struct rte_eth_stats repr_stats;
+
+	struct rte_eth_xstat *repr_xstats_base;
+	uint8_t *mac_stats;
 };
 
 int nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower,
 		struct nfp_net_hw_priv *hw_priv);
 bool nfp_flower_repr_is_vf(struct nfp_flower_representor *repr);
+int nfp_flower_repr_stats_reset(struct rte_eth_dev *ethdev);
 
 #endif /* __NFP_FLOWER_REPRESENTOR_H__ */
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 7541afa235..260920ecff 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -954,12 +954,23 @@ uint32_t
 nfp_net_xstats_size(const struct rte_eth_dev *dev)
 {
 	uint32_t count;
+	bool vf_flag = false;
 	struct nfp_net_hw *hw;
+	struct nfp_flower_representor *repr;
 	const uint32_t size = RTE_DIM(nfp_net_xstats);
 
-	/* If the device is a VF, then there will be no MAC stats */
-	hw = nfp_net_get_hw(dev);
-	if (hw->mac_stats == NULL) {
+	if (rte_eth_dev_is_repr(dev)) {
+		repr = dev->data->dev_private;
+		if (repr->mac_stats == NULL)
+			vf_flag = true;
+	} else {
+		hw = dev->data->dev_private;
+		if (hw->mac_stats == NULL)
+			vf_flag = true;
+	}
+
+	/* If the device is a VF or VF-repr, then there will be no MAC stats */
+	if (vf_flag) {
 		for (count = 0; count < size; count++) {
 			if (nfp_net_xstats[count].group == NFP_XSTAT_GROUP_MAC)
 				break;
@@ -989,14 +1000,29 @@ nfp_net_xstats_value(const struct rte_eth_dev *dev,
 		bool raw)
 {
 	uint64_t value;
+	uint8_t *mac_stats;
 	struct nfp_net_hw *hw;
 	struct nfp_xstat xstat;
+	struct rte_eth_xstat *xstats_base;
+	struct nfp_flower_representor *repr;
+
+	if (rte_eth_dev_is_repr(dev)) {
+		repr = dev->data->dev_private;
+		hw = repr->app_fw_flower->pf_hw;
+
+		mac_stats = repr->mac_stats;
+		xstats_base = repr->repr_xstats_base;
+	} else {
+		hw = dev->data->dev_private;
+
+		mac_stats = hw->mac_stats;
+		xstats_base = hw->eth_xstats_base;
+	}
 
-	hw = nfp_net_get_hw(dev);
 	xstat = nfp_net_xstats[index];
 
 	if (xstat.group == NFP_XSTAT_GROUP_MAC)
-		value = nn_readq(hw->mac_stats + xstat.offset);
+		value = nn_readq(mac_stats + xstat.offset);
 	else
 		value = nn_cfg_readq(&hw->super, xstat.offset);
 
@@ -1009,7 +1035,7 @@ nfp_net_xstats_value(const struct rte_eth_dev *dev,
 	 * baseline value. The result is the count of this statistic since the last time
 	 * it was "reset".
 	 */
-	return value - hw->eth_xstats_base[index].value;
+	return value - xstats_base[index].value;
 }
 
 /* NOTE: All callers ensure dev is always set. */
@@ -1130,17 +1156,29 @@ nfp_net_xstats_reset(struct rte_eth_dev *dev)
 	uint32_t id;
 	uint32_t read_size;
 	struct nfp_net_hw *hw;
+	struct rte_eth_xstat *xstats_base;
+	struct nfp_flower_representor *repr;
 
-	hw = nfp_net_get_hw(dev);
 	read_size = nfp_net_xstats_size(dev);
 
+	if (rte_eth_dev_is_repr(dev)) {
+		repr = dev->data->dev_private;
+		xstats_base = repr->repr_xstats_base;
+	} else {
+		hw = dev->data->dev_private;
+		xstats_base = hw->eth_xstats_base;
+	}
+
 	for (id = 0; id < read_size; id++) {
-		hw->eth_xstats_base[id].id = id;
-		hw->eth_xstats_base[id].value = nfp_net_xstats_value(dev, id, true);
+		xstats_base[id].id = id;
+		xstats_base[id].value = nfp_net_xstats_value(dev, id, true);
 	}
 
 	/* Successfully reset xstats, now call function to reset basic stats. */
-	return nfp_net_stats_reset(dev);
+	if (rte_eth_dev_is_repr(dev))
+		return nfp_flower_repr_stats_reset(dev);
+	else
+		return nfp_net_stats_reset(dev);
 }
 
 void
-- 
2.39.1


  parent reply	other threads:[~2024-05-23  2:50 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-23  2:49 [PATCH 0/2] NFP extend stats Chaoyong He
2024-05-23  2:49 ` [PATCH 1/2] net/nfp: fix xstats problem for multi PF firmware Chaoyong He
2024-05-23  2:49 ` Chaoyong He [this message]
2024-06-12  1:40 ` [PATCH 0/2] NFP extend stats Ferruh Yigit

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=20240523024916.2291031-3-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).