From: Levend Sayar <levendsayar@gmail.com>
To: junfeng.guo@intel.com
Cc: dev@dpdk.org, Levend Sayar <levendsayar@gmail.com>
Subject: [PATCH v5] net/gve: add Rx/Tx queue stats as extended stats
Date: Tue, 21 Feb 2023 17:18:13 +0300 [thread overview]
Message-ID: <20230221141814.13674-1-levendsayar@gmail.com> (raw)
In-Reply-To: <20230221141350.12335-1-levendsayar@gmail.com>
Google Virtual NIC rx/tx queue stats are added as extended stats.
Signed-off-by: Levend Sayar <levendsayar@gmail.com>
---
drivers/net/gve/gve_ethdev.c | 137 +++++++++++++++++++++++++++++++----
drivers/net/gve/gve_ethdev.h | 28 +++++--
drivers/net/gve/gve_rx.c | 12 +--
drivers/net/gve/gve_tx.c | 11 +--
4 files changed, 157 insertions(+), 31 deletions(-)
diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c
index fef2458a16..21f0c0fca2 100644
--- a/drivers/net/gve/gve_ethdev.c
+++ b/drivers/net/gve/gve_ethdev.c
@@ -6,9 +6,26 @@
#include "base/gve_adminq.h"
#include "base/gve_register.h"
+#define TX_QUEUE_STATS_OFFSET(x) offsetof(struct gve_tx_stats, x)
+#define RX_QUEUE_STATS_OFFSET(x) offsetof(struct gve_rx_stats, x)
+
const char gve_version_str[] = GVE_VERSION;
static const char gve_version_prefix[] = GVE_VERSION_PREFIX;
+static const struct gve_xstats_name_offset tx_xstats_name_offset[] = {
+ { "packets", TX_QUEUE_STATS_OFFSET(packets) },
+ { "bytes", TX_QUEUE_STATS_OFFSET(bytes) },
+ { "errors", TX_QUEUE_STATS_OFFSET(errors) },
+};
+
+static const struct gve_xstats_name_offset rx_xstats_name_offset[] = {
+ { "packets", RX_QUEUE_STATS_OFFSET(packets) },
+ { "bytes", RX_QUEUE_STATS_OFFSET(bytes) },
+ { "errors", RX_QUEUE_STATS_OFFSET(errors) },
+ { "mbuf_alloc_errors", RX_QUEUE_STATS_OFFSET(no_mbufs) },
+ { "mbuf_alloc_errors_bulk", RX_QUEUE_STATS_OFFSET(no_mbufs_bulk) },
+};
+
static void
gve_write_version(uint8_t *driver_version_register)
{
@@ -328,9 +345,9 @@ gve_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
if (txq == NULL)
continue;
- stats->opackets += txq->packets;
- stats->obytes += txq->bytes;
- stats->oerrors += txq->errors;
+ stats->opackets += txq->stats.packets;
+ stats->obytes += txq->stats.bytes;
+ stats->oerrors += txq->stats.errors;
}
for (i = 0; i < dev->data->nb_rx_queues; i++) {
@@ -338,10 +355,10 @@ gve_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
if (rxq == NULL)
continue;
- stats->ipackets += rxq->packets;
- stats->ibytes += rxq->bytes;
- stats->ierrors += rxq->errors;
- stats->rx_nombuf += rxq->no_mbufs;
+ stats->ipackets += rxq->stats.packets;
+ stats->ibytes += rxq->stats.bytes;
+ stats->ierrors += rxq->stats.errors;
+ stats->rx_nombuf += rxq->stats.no_mbufs;
}
return 0;
@@ -357,9 +374,7 @@ gve_dev_stats_reset(struct rte_eth_dev *dev)
if (txq == NULL)
continue;
- txq->packets = 0;
- txq->bytes = 0;
- txq->errors = 0;
+ memset(&txq->stats, 0, sizeof(txq->stats));
}
for (i = 0; i < dev->data->nb_rx_queues; i++) {
@@ -367,10 +382,7 @@ gve_dev_stats_reset(struct rte_eth_dev *dev)
if (rxq == NULL)
continue;
- rxq->packets = 0;
- rxq->bytes = 0;
- rxq->errors = 0;
- rxq->no_mbufs = 0;
+ memset(&rxq->stats, 0, sizeof(rxq->stats));
}
return 0;
@@ -403,6 +415,101 @@ gve_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
return 0;
}
+static int
+gve_xstats_count(struct rte_eth_dev *dev)
+{
+ uint16_t i, count = 0;
+
+ for (i = 0; i < dev->data->nb_tx_queues; i++) {
+ if (dev->data->tx_queues[i])
+ count += RTE_DIM(tx_xstats_name_offset);
+ }
+
+ for (i = 0; i < dev->data->nb_rx_queues; i++) {
+ if (dev->data->rx_queues[i])
+ count += RTE_DIM(rx_xstats_name_offset);
+ }
+
+ return count;
+}
+
+static int
+gve_xstats_get(struct rte_eth_dev *dev,
+ struct rte_eth_xstat *xstats,
+ unsigned int size)
+{
+ uint16_t i, j, count = gve_xstats_count(dev);
+ const char *stats;
+
+ if (xstats == NULL || size < count)
+ return count;
+
+ count = 0;
+
+ for (i = 0; i < dev->data->nb_tx_queues; i++) {
+ const struct gve_tx_queue *txq = dev->data->tx_queues[i];
+ if (txq == NULL)
+ continue;
+
+ stats = (const char *)&txq->stats;
+ for (j = 0; j < RTE_DIM(tx_xstats_name_offset); j++, count++) {
+ xstats[count].id = count;
+ xstats[count].value = *(const uint64_t *)
+ (stats + tx_xstats_name_offset[j].offset);
+ }
+ }
+
+ for (i = 0; i < dev->data->nb_rx_queues; i++) {
+ const struct gve_rx_queue *rxq = dev->data->rx_queues[i];
+ if (rxq == NULL)
+ continue;
+
+ stats = (const char *)&rxq->stats;
+ for (j = 0; j < RTE_DIM(rx_xstats_name_offset); j++, count++) {
+ xstats[count].id = count;
+ xstats[count].value = *(const uint64_t *)
+ (stats + rx_xstats_name_offset[j].offset);
+ }
+ }
+
+ return count;
+}
+
+static int
+gve_xstats_get_names(struct rte_eth_dev *dev,
+ struct rte_eth_xstat_name *xstats_names,
+ unsigned int size)
+{
+ uint16_t i, j, count = gve_xstats_count(dev);
+
+ if (xstats_names == NULL || size < count)
+ return count;
+
+ count = 0;
+
+ for (i = 0; i < dev->data->nb_tx_queues; i++) {
+ if (dev->data->tx_queues[i] == NULL)
+ continue;
+
+ for (j = 0; j < RTE_DIM(tx_xstats_name_offset); j++)
+ snprintf(xstats_names[count++].name,
+ RTE_ETH_XSTATS_NAME_SIZE,
+ "tx_q%u_%s", i, tx_xstats_name_offset[j].name);
+ }
+
+ for (i = 0; i < dev->data->nb_rx_queues; i++) {
+ if (dev->data->rx_queues[i] == NULL)
+ continue;
+
+ for (j = 0; j < RTE_DIM(rx_xstats_name_offset); j++)
+ snprintf(xstats_names[count++].name,
+ RTE_ETH_XSTATS_NAME_SIZE,
+ "rx_q%u_%s", i, rx_xstats_name_offset[j].name);
+ }
+
+ return count;
+}
+
static const struct eth_dev_ops gve_eth_dev_ops = {
.dev_configure = gve_dev_configure,
.dev_start = gve_dev_start,
@@ -417,6 +524,8 @@ static const struct eth_dev_ops gve_eth_dev_ops = {
.stats_get = gve_dev_stats_get,
.stats_reset = gve_dev_stats_reset,
.mtu_set = gve_dev_mtu_set,
+ .xstats_get = gve_xstats_get,
+ .xstats_get_names = gve_xstats_get_names,
};
static void
diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h
index 64e571bcae..42a02cf5d4 100644
--- a/drivers/net/gve/gve_ethdev.h
+++ b/drivers/net/gve/gve_ethdev.h
@@ -67,6 +67,25 @@ struct gve_tx_iovec {
uint32_t iov_len;
};
+struct gve_tx_stats {
+ uint64_t packets;
+ uint64_t bytes;
+ uint64_t errors;
+};
+
+struct gve_rx_stats {
+ uint64_t packets;
+ uint64_t bytes;
+ uint64_t errors;
+ uint64_t no_mbufs;
+ uint64_t no_mbufs_bulk;
+};
+
+struct gve_xstats_name_offset {
+ char name[RTE_ETH_XSTATS_NAME_SIZE];
+ unsigned int offset;
+};
+
struct gve_tx_queue {
volatile union gve_tx_desc *tx_desc_ring;
const struct rte_memzone *mz;
@@ -93,9 +112,7 @@ struct gve_tx_queue {
struct gve_tx_iovec *iov_ring;
/* stats items */
- uint64_t packets;
- uint64_t bytes;
- uint64_t errors;
+ struct gve_tx_stats stats;
uint16_t port_id;
uint16_t queue_id;
@@ -136,10 +153,7 @@ struct gve_rx_queue {
struct gve_queue_page_list *qpl;
/* stats items */
- uint64_t packets;
- uint64_t bytes;
- uint64_t errors;
- uint64_t no_mbufs;
+ struct gve_rx_stats stats;
struct gve_priv *hw;
const struct rte_memzone *qres_mz;
diff --git a/drivers/net/gve/gve_rx.c b/drivers/net/gve/gve_rx.c
index d346efa57c..8d8f94efff 100644
--- a/drivers/net/gve/gve_rx.c
+++ b/drivers/net/gve/gve_rx.c
@@ -20,6 +20,7 @@ gve_rx_refill(struct gve_rx_queue *rxq)
if (nb_alloc <= rxq->nb_avail) {
diag = rte_pktmbuf_alloc_bulk(rxq->mpool, &rxq->sw_ring[idx], nb_alloc);
if (diag < 0) {
+ rxq->stats.no_mbufs_bulk++;
for (i = 0; i < nb_alloc; i++) {
nmb = rte_pktmbuf_alloc(rxq->mpool);
if (!nmb)
@@ -27,7 +28,7 @@ gve_rx_refill(struct gve_rx_queue *rxq)
rxq->sw_ring[idx + i] = nmb;
}
if (i != nb_alloc) {
- rxq->no_mbufs += nb_alloc - i;
+ rxq->stats.no_mbufs += nb_alloc - i;
nb_alloc = i;
}
}
@@ -55,6 +56,7 @@ gve_rx_refill(struct gve_rx_queue *rxq)
nb_alloc = rxq->nb_rx_desc - idx;
diag = rte_pktmbuf_alloc_bulk(rxq->mpool, &rxq->sw_ring[idx], nb_alloc);
if (diag < 0) {
+ rxq->stats.no_mbufs_bulk++;
for (i = 0; i < nb_alloc; i++) {
nmb = rte_pktmbuf_alloc(rxq->mpool);
if (!nmb)
@@ -62,7 +64,7 @@ gve_rx_refill(struct gve_rx_queue *rxq)
rxq->sw_ring[idx + i] = nmb;
}
if (i != nb_alloc) {
- rxq->no_mbufs += nb_alloc - i;
+ rxq->stats.no_mbufs += nb_alloc - i;
nb_alloc = i;
}
}
@@ -106,7 +108,7 @@ gve_rx_burst(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
break;
if (rxd->flags_seq & GVE_RXF_ERR) {
- rxq->errors++;
+ rxq->stats.errors++;
continue;
}
@@ -154,8 +156,8 @@ gve_rx_burst(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
gve_rx_refill(rxq);
if (nb_rx) {
- rxq->packets += nb_rx;
- rxq->bytes += bytes;
+ rxq->stats.packets += nb_rx;
+ rxq->stats.bytes += bytes;
}
return nb_rx;
diff --git a/drivers/net/gve/gve_tx.c b/drivers/net/gve/gve_tx.c
index 9b41c59358..fee3b939c7 100644
--- a/drivers/net/gve/gve_tx.c
+++ b/drivers/net/gve/gve_tx.c
@@ -366,9 +366,9 @@ gve_tx_burst_qpl(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
txq->tx_tail = tx_tail;
txq->sw_tail = sw_id;
- txq->packets += nb_tx;
- txq->bytes += bytes;
- txq->errors += nb_pkts - nb_tx;
+ txq->stats.packets += nb_tx;
+ txq->stats.bytes += bytes;
+ txq->stats.errors += nb_pkts - nb_tx;
}
return nb_tx;
@@ -455,8 +455,9 @@ gve_tx_burst_ra(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
rte_write32(rte_cpu_to_be_32(tx_tail), txq->qtx_tail);
txq->tx_tail = tx_tail;
- txq->packets += nb_tx;
- txq->bytes += bytes;
+ txq->stats.packets += nb_tx;
+ txq->stats.bytes += bytes;
+ txq->stats.errors += nb_pkts - nb_tx;
}
return nb_tx;
--
2.37.1 (Apple Git-137.1)
next prev parent reply other threads:[~2023-02-21 14:18 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-19 0:30 [PATCH] net/gve: fix Rx no mbufs stats counter update Levend Sayar
2023-02-19 17:35 ` Stephen Hemminger
2023-02-19 20:43 ` Levend Sayar
2023-02-19 22:59 ` Stephen Hemminger
2023-02-20 15:19 ` [PATCH v2] " Levend Sayar
2023-02-20 21:11 ` [PATCH v3 1/2] " Levend Sayar
2023-02-20 21:11 ` [PATCH v3 2/2] net/gve: add Rx/Tx queue stats as extended stats Levend Sayar
2023-02-20 22:57 ` Ferruh Yigit
2023-02-21 11:11 ` Levend Sayar
2023-02-21 14:13 ` [PATCH v4] " Levend Sayar
2023-02-21 14:18 ` Levend Sayar [this message]
2023-02-21 15:58 ` [PATCH v5] " Ferruh Yigit
2023-02-21 16:44 ` Levend Sayar
2023-02-23 2:49 ` Guo, Junfeng
2023-02-23 6:28 ` Levend Sayar
2023-02-23 11:09 ` Ferruh Yigit
2023-02-23 12:30 ` Levend Sayar
2023-02-20 22:57 ` [PATCH v3 1/2] net/gve: fix Rx no mbufs stats counter update Ferruh Yigit
2023-02-21 10:07 ` Levend Sayar
2023-02-21 10:30 ` Ferruh Yigit
2023-02-23 4:34 ` Guo, Junfeng
2023-02-23 6:29 ` Levend Sayar
2023-02-23 11:10 ` Ferruh Yigit
2023-02-23 12:29 ` Levend Sayar
2023-02-21 15:58 ` Ferruh Yigit
2023-02-21 16:42 ` Levend Sayar
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=20230221141814.13674-1-levendsayar@gmail.com \
--to=levendsayar@gmail.com \
--cc=dev@dpdk.org \
--cc=junfeng.guo@intel.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 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.