76 lines
2.5 KiB
Diff
76 lines
2.5 KiB
Diff
From 3577b1ee97dcfe9ff1b9e050bed55f17c435a93d Mon Sep 17 00:00:00 2001
|
|
From: Ciara Loftus <ciara.loftus@intel.com>
|
|
Date: Tue, 14 May 2024 08:41:54 +0000
|
|
Subject: [PATCH] net/af_xdp: fix stats reset
|
|
|
|
[ upstream commit 3577b1ee97dcfe9ff1b9e050bed55f17c435a93d ]
|
|
|
|
The imissed statistic was not properly reset because it was
|
|
read directly from the kernel statistics. To fix this, take note
|
|
of the kernel statistic when the stats are reset and deduct this
|
|
value from the kernel statistic read during statistics get.
|
|
|
|
Bugzilla ID: 1430
|
|
Fixes: f1debd77efaf ("net/af_xdp: introduce AF_XDP PMD")
|
|
Cc: stable@dpdk.org
|
|
|
|
Reported-by: Stephen Hemminger <stephen@networkplumber.org>
|
|
Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
|
|
Acked-by: Maryam Tahhan <mtahhan@redhat.com>
|
|
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
|
|
---
|
|
drivers/net/af_xdp/rte_eth_af_xdp.c | 17 +++++++++++++++--
|
|
1 file changed, 15 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c
|
|
index 0db761a204..25e67851f6 100644
|
|
--- a/drivers/net/af_xdp/rte_eth_af_xdp.c
|
|
+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c
|
|
@@ -126,6 +126,7 @@ struct rx_stats {
|
|
uint64_t rx_pkts;
|
|
uint64_t rx_bytes;
|
|
uint64_t rx_dropped;
|
|
+ uint64_t imissed_offset;
|
|
};
|
|
|
|
struct pkt_rx_queue {
|
|
@@ -892,7 +893,7 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
|
|
AF_XDP_LOG(ERR, "getsockopt() failed for XDP_STATISTICS.\n");
|
|
return -1;
|
|
}
|
|
- stats->imissed += xdp_stats.rx_dropped;
|
|
+ stats->imissed += xdp_stats.rx_dropped - rxq->stats.imissed_offset;
|
|
|
|
stats->opackets += stats->q_opackets[i];
|
|
stats->obytes += stats->q_obytes[i];
|
|
@@ -905,13 +906,25 @@ static int
|
|
eth_stats_reset(struct rte_eth_dev *dev)
|
|
{
|
|
struct pmd_internals *internals = dev->data->dev_private;
|
|
- int i;
|
|
+ struct pmd_process_private *process_private = dev->process_private;
|
|
+ struct xdp_statistics xdp_stats;
|
|
+ socklen_t optlen;
|
|
+ int i, ret, fd;
|
|
|
|
for (i = 0; i < internals->queue_cnt; i++) {
|
|
memset(&internals->rx_queues[i].stats, 0,
|
|
sizeof(struct rx_stats));
|
|
memset(&internals->tx_queues[i].stats, 0,
|
|
sizeof(struct tx_stats));
|
|
+ fd = process_private->rxq_xsk_fds[i];
|
|
+ optlen = sizeof(struct xdp_statistics);
|
|
+ ret = fd >= 0 ? getsockopt(fd, SOL_XDP, XDP_STATISTICS,
|
|
+ &xdp_stats, &optlen) : -1;
|
|
+ if (ret != 0) {
|
|
+ AF_XDP_LOG(ERR, "getsockopt() failed for XDP_STATISTICS.\n");
|
|
+ return -1;
|
|
+ }
|
|
+ internals->rx_queues[i].stats.imissed_offset = xdp_stats.rx_dropped;
|
|
}
|
|
|
|
return 0;
|
|
--
|
|
2.33.0
|
|
|