From: Anshumali Gaur <agaur@marvell.com>
To: <andrew+netdev@lunn.ch>, <davem@davemloft.net>,
<edumazet@google.com>, <kuba@kernel.org>, <pabeni@redhat.com>,
<netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: Anshumali Gaur <agaur@marvell.com>
Subject: [PATCH] octeontx2-pf: persist netdev stats across routine operations
Date: Mon, 11 May 2026 12:56:51 +0530 [thread overview]
Message-ID: <20260511072651.1421764-1-agaur@marvell.com> (raw)
Currently netdev driver is not retaining ethtool stats during
interface up and down, as per kernel driver standard netdev driver
must keep stats constant to avoid race conditions with user space
trying to read them. Stats must persist across routine
operations like bringing the interface down and up.
Signed-off-by: Anshumali Gaur <agaur@marvell.com>
---
.../marvell/octeontx2/nic/otx2_common.c | 20 ++++++++++---------
.../marvell/octeontx2/nic/otx2_common.h | 1 +
.../ethernet/marvell/octeontx2/nic/otx2_pf.c | 18 +++++++++++++++++
3 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
index 971fcab1c248..0ffcc613a4b2 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
@@ -139,19 +139,21 @@ void otx2_get_stats64(struct net_device *netdev,
struct rtnl_link_stats64 *stats)
{
struct otx2_nic *pfvf = netdev_priv(netdev);
- struct otx2_dev_stats *dev_stats;
+ struct otx2_dev_stats *dev_stats, *old_stats;
otx2_get_dev_stats(pfvf);
dev_stats = &pfvf->hw.dev_stats;
- stats->rx_bytes = dev_stats->rx_bytes;
- stats->rx_packets = dev_stats->rx_frames;
- stats->rx_dropped = dev_stats->rx_drops;
- stats->multicast = dev_stats->rx_mcast_frames;
-
- stats->tx_bytes = dev_stats->tx_bytes;
- stats->tx_packets = dev_stats->tx_frames;
- stats->tx_dropped = dev_stats->tx_drops;
+ old_stats = &pfvf->hw.old_stats;
+
+ stats->rx_bytes = old_stats->rx_bytes + dev_stats->rx_bytes;
+ stats->rx_packets = old_stats->rx_frames + dev_stats->rx_frames;
+ stats->rx_dropped = old_stats->rx_drops + dev_stats->rx_drops;
+ stats->multicast = old_stats->rx_mcast_frames + dev_stats->rx_mcast_frames;
+
+ stats->tx_bytes = old_stats->tx_bytes + dev_stats->tx_bytes;
+ stats->tx_packets = old_stats->tx_frames + dev_stats->tx_frames;
+ stats->tx_dropped = old_stats->tx_drops + dev_stats->tx_drops;
}
EXPORT_SYMBOL(otx2_get_stats64);
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
index eecee612b7b2..ad65aa19b80d 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
@@ -255,6 +255,7 @@ struct otx2_hw {
/* Stats */
struct otx2_dev_stats dev_stats;
+ struct otx2_dev_stats old_stats;
struct otx2_drv_stats drv_stats;
u64 cgx_rx_stats[CGX_RX_STATS_COUNT];
u64 cgx_tx_stats[CGX_TX_STATS_COUNT];
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
index ee623476e5ff..9606c8cb8c82 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
@@ -2158,10 +2158,28 @@ int otx2_stop(struct net_device *netdev)
struct otx2_qset *qset = &pf->qset;
int qidx, vec, wrk;
+ struct otx2_dev_stats *dev = &pf->hw.dev_stats;
+ struct otx2_dev_stats *old_stats = &pf->hw.old_stats;
+
/* If the DOWN flag is set resources are already freed */
if (pf->flags & OTX2_FLAG_INTF_DOWN)
return 0;
+ /* Accumulate old stats */
+ old_stats->rx_bytes += dev->rx_bytes;
+ old_stats->rx_drops += dev->rx_drops;
+ old_stats->rx_bcast_frames += dev->rx_bcast_frames;
+ old_stats->rx_mcast_frames += dev->rx_mcast_frames;
+ old_stats->rx_ucast_frames += dev->rx_ucast_frames;
+ old_stats->rx_frames += dev->rx_frames;
+
+ old_stats->tx_bytes += dev->tx_bytes;
+ old_stats->tx_drops += dev->tx_drops;
+ old_stats->tx_bcast_frames += dev->tx_bcast_frames;
+ old_stats->tx_mcast_frames += dev->tx_mcast_frames;
+ old_stats->tx_ucast_frames += dev->tx_ucast_frames;
+ old_stats->tx_frames += dev->tx_frames;
+
netif_carrier_off(netdev);
netif_tx_stop_all_queues(netdev);
--
2.25.1
reply other threads:[~2026-05-11 7:27 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20260511072651.1421764-1-agaur@marvell.com \
--to=agaur@marvell.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.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