All of lore.kernel.org
 help / color / mirror / Atom feed
From: Harry van Haaren <harry.van.haaren@intel.com>
To: dev@dpdk.org
Subject: [PATCH 3/3] i40e: refactor xstats queue handling
Date: Fri,  6 Nov 2015 14:12:55 +0000	[thread overview]
Message-ID: <1446819175-31325-4-git-send-email-harry.van.haaren@intel.com> (raw)
In-Reply-To: <1446819175-31325-1-git-send-email-harry.van.haaren@intel.com>

This patch refactors the queue and priority statistic handling.
Generic queue stats are presented by rte_eth_xstats_get(), and the
i40e_xstats_get() exposes only the extra stats.

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c | 112 ++++++++++++++++++++++++-----------------
 1 file changed, 65 insertions(+), 47 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index ddf3d38..c3f0235 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -490,6 +490,9 @@ static const struct rte_i40e_xstats_name_off rte_i40e_stats_strings[] = {
 	{"tx_dropped", offsetof(struct i40e_eth_stats, tx_discards)},
 };
 
+#define I40E_NB_ETH_XSTATS (sizeof(rte_i40e_stats_strings) / \
+		sizeof(rte_i40e_stats_strings[0]))
+
 static const struct rte_i40e_xstats_name_off rte_i40e_hw_port_strings[] = {
 	{"tx_link_down_dropped", offsetof(struct i40e_hw_port_stats,
 		tx_dropped_link_down)},
@@ -556,15 +559,30 @@ static const struct rte_i40e_xstats_name_off rte_i40e_hw_port_strings[] = {
 		rx_lpi_count)},
 };
 
-/* Q Stats: 5 stats are exposed for each queue, implemented in xstats_get() */
-#define I40E_NB_HW_PORT_Q_STATS (8 * 5)
-
-#define I40E_NB_ETH_XSTATS (sizeof(rte_i40e_stats_strings) / \
-		sizeof(rte_i40e_stats_strings[0]))
 #define I40E_NB_HW_PORT_XSTATS (sizeof(rte_i40e_hw_port_strings) / \
 		sizeof(rte_i40e_hw_port_strings[0]))
-#define I40E_NB_XSTATS (I40E_NB_ETH_XSTATS + I40E_NB_HW_PORT_XSTATS + \
-		I40E_NB_HW_PORT_Q_STATS)
+
+static const struct rte_i40e_xstats_name_off rte_i40e_rxq_prio_strings[] = {
+	{"xon_packets", offsetof(struct i40e_hw_port_stats,
+		priority_xon_rx)},
+	{"xoff_packets", offsetof(struct i40e_hw_port_stats,
+		priority_xoff_rx)},
+};
+
+#define I40E_NB_RXQ_PRIO_XSTATS (sizeof(rte_i40e_rxq_prio_strings) / \
+		sizeof(rte_i40e_rxq_prio_strings[0]))
+
+static const struct rte_i40e_xstats_name_off rte_i40e_txq_prio_strings[] = {
+	{"xon_packets", offsetof(struct i40e_hw_port_stats,
+		priority_xon_tx)},
+	{"xoff_packets", offsetof(struct i40e_hw_port_stats,
+		priority_xoff_tx)},
+	{"xon_to_xoff_packets", offsetof(struct i40e_hw_port_stats,
+		priority_xon_2_xoff)},
+};
+
+#define I40E_NB_TXQ_PRIO_XSTATS (sizeof(rte_i40e_txq_prio_strings) / \
+		sizeof(rte_i40e_txq_prio_strings[0]))
 
 static struct eth_driver rte_i40e_pmd = {
 	.pci_drv = {
@@ -2124,6 +2142,14 @@ i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 	PMD_DRV_LOG(DEBUG, "***************** PF stats end ********************");
 }
 
+static uint32_t
+i40e_xstats_calc_num(void)
+{
+	return I40E_NB_ETH_XSTATS + I40E_NB_HW_PORT_XSTATS +
+		(I40E_NB_RXQ_PRIO_XSTATS * 8) +
+		(I40E_NB_TXQ_PRIO_XSTATS * 8);
+}
+
 static void
 i40e_dev_xstats_reset(struct rte_eth_dev *dev)
 {
@@ -2145,18 +2171,20 @@ i40e_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	unsigned i, count = 0;
+	unsigned i, count, prio;
 	struct i40e_hw_port_stats *hw_stats = &pf->stats;
 
-	if (n < I40E_NB_XSTATS)
-		return I40E_NB_XSTATS;
+	count = i40e_xstats_calc_num();
+	if (n < count)
+		return count;
 
 	i40e_read_stats_registers(pf, hw);
 
-	/* Reset */
 	if (xstats == NULL)
 		return 0;
 
+	count = 0;
+
 	/* Get stats from i40e_eth_stats struct */
 	for (i = 0; i < I40E_NB_ETH_XSTATS; i++) {
 		snprintf(xstats[count].name, sizeof(xstats[count].name),
@@ -2175,45 +2203,35 @@ i40e_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
 		count++;
 	}
 
-	/* Get per-queue stats from i40e_hw_port struct */
-	for (i = 0; i < 8; i++) {
-		snprintf(xstats[count].name, sizeof(xstats[count].name),
-			 "rx_q%u_xon_priority_packets", i);
-		xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
-				offsetof(struct i40e_hw_port_stats,
-					 priority_xon_rx[i]));
-		count++;
-
-		snprintf(xstats[count].name, sizeof(xstats[count].name),
-			 "rx_q%u_xoff_priority_packets", i);
-		xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
-				offsetof(struct i40e_hw_port_stats,
-					 priority_xoff_rx[i]));
-		count++;
-
-		snprintf(xstats[count].name, sizeof(xstats[count].name),
-			 "tx_q%u_xon_priority_packets", i);
-		xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
-				offsetof(struct i40e_hw_port_stats,
-					 priority_xon_tx[i]));
-		count++;
-
-		snprintf(xstats[count].name, sizeof(xstats[count].name),
-			 "tx_q%u_xoff_priority_packets", i);
-		xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
-				offsetof(struct i40e_hw_port_stats,
-					 priority_xoff_tx[i]));
-		count++;
+	for (i = 0; i < I40E_NB_RXQ_PRIO_XSTATS; i++) {
+		for (prio = 0; prio < 8; prio++) {
+			snprintf(xstats[count].name,
+				 sizeof(xstats[count].name),
+				 "rx_priority%u_%s", prio,
+				 rte_i40e_rxq_prio_strings[i].name);
+			xstats[count].value =
+				*(uint64_t *)(((char *)hw_stats) +
+				rte_i40e_rxq_prio_strings[i].offset +
+				(sizeof(uint64_t) * prio));
+			count++;
+		}
+	}
 
-		snprintf(xstats[count].name, sizeof(xstats[count].name),
-			 "xx_q%u_xon_to_xoff_priority_packets", i);
-		xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
-				offsetof(struct i40e_hw_port_stats,
-					 priority_xon_2_xoff[i]));
-		count++;
+	for (i = 0; i < I40E_NB_TXQ_PRIO_XSTATS; i++) {
+		for (prio = 0; prio < 8; prio++) {
+			snprintf(xstats[count].name,
+				 sizeof(xstats[count].name),
+				 "tx_priority%u_%s", prio,
+				 rte_i40e_txq_prio_strings[i].name);
+			xstats[count].value =
+				*(uint64_t *)(((char *)hw_stats) +
+				rte_i40e_txq_prio_strings[i].offset +
+				(sizeof(uint64_t) * prio));
+			count++;
+		}
 	}
 
-	return I40E_NB_XSTATS;
+	return count;
 }
 
 /* Reset the statistics */
-- 
1.9.1

  parent reply	other threads:[~2015-11-06 14:13 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-06 14:12 [PATCH 0/3] xstats queue handling Harry van Haaren
2015-11-06 14:12 ` [PATCH 1/3] ethdev: xstats generic Q stats refactor Harry van Haaren
2015-11-08  7:39   ` Tahhan, Maryam
2015-11-06 14:12 ` [PATCH 2/3] ixgbe: refactor xstats queue handling Harry van Haaren
2015-11-08  7:37   ` Tahhan, Maryam
2015-11-06 14:12 ` Harry van Haaren [this message]
2015-11-08  7:34   ` [PATCH 3/3] i40e: " Tahhan, Maryam
2015-11-12 16:36 ` [PATCH 0/3] " Thomas Monjalon

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=1446819175-31325-4-git-send-email-harry.van.haaren@intel.com \
    --to=harry.van.haaren@intel.com \
    --cc=dev@dpdk.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.