patch 'net/memif: fix statistics' has been queued to stable release 24.11.9

luca.boccassi at gmail.com luca.boccassi at gmail.com
Tue Oct 27 12:50:26 CET 2026


Hi,

FYI, your patch has been queued to stable release 24.11.9

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 10/29/26. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable

This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/4a42f0be9a0830a23e89cbaaea213a42639a6e19

Thanks.

Luca Boccassi

---
>From 4a42f0be9a0830a23e89cbaaea213a42639a6e19 Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen at networkplumber.org>
Date: Tue, 22 Sep 2026 12:40:53 -0700
Subject: [PATCH] net/memif: fix statistics

[ upstream commit e7793922cca0649008ce26aaebccfcb8e3daf2b6 ]

The statistics structure is already cleared in ethdev before
calling PMD.
Statistics from all queues should be counted against overall
packets; the constant RTE_ETHDEV_QUEUE_STAT_CNTRS is upper
bound on the array of queue stats.

The counters were also keyed off the negotiated ring counts in
pmd->run, which memif_disconnect() clears, so every counter read
back as zero once the peer went away. Iterate over the configured
queue counts instead, in both stats_get and stats_reset, so the
totals survive a disconnect.

Fixes: 09c7e63a71f9 ("net/memif: introduce memory interface PMD")

Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
---
 drivers/net/memif/rte_eth_memif.c | 49 +++++++++++--------------------
 1 file changed, 17 insertions(+), 32 deletions(-)

diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c
index 28a06abe0a6..cf03ee1a878 100644
--- a/drivers/net/memif/rte_eth_memif.c
+++ b/drivers/net/memif/rte_eth_memif.c
@@ -1592,41 +1592,28 @@ memif_link_update(struct rte_eth_dev *dev,
 static int
 memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
-	struct pmd_internals *pmd = dev->data->dev_private;
 	struct memif_queue *mq;
-	int i;
-	uint8_t tmp, nq;
-
-	stats->ipackets = 0;
-	stats->ibytes = 0;
-	stats->opackets = 0;
-	stats->obytes = 0;
-
-	tmp = (pmd->role == MEMIF_ROLE_CLIENT) ? pmd->run.num_s2c_rings :
-	    pmd->run.num_c2s_rings;
-	nq = (tmp < RTE_ETHDEV_QUEUE_STAT_CNTRS) ? tmp :
-	    RTE_ETHDEV_QUEUE_STAT_CNTRS;
+	unsigned int i;
 
 	/* RX stats */
-	for (i = 0; i < nq; i++) {
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
 		mq = dev->data->rx_queues[i];
-		stats->q_ipackets[i] = mq->n_pkts;
-		stats->q_ibytes[i] = mq->n_bytes;
+		if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
+			stats->q_ipackets[i] = mq->n_pkts;
+			stats->q_ibytes[i] = mq->n_bytes;
+		}
 		stats->ipackets += mq->n_pkts;
 		stats->ibytes += mq->n_bytes;
 		stats->ierrors += mq->n_err;
 	}
 
-	tmp = (pmd->role == MEMIF_ROLE_CLIENT) ? pmd->run.num_c2s_rings :
-	    pmd->run.num_s2c_rings;
-	nq = (tmp < RTE_ETHDEV_QUEUE_STAT_CNTRS) ? tmp :
-	    RTE_ETHDEV_QUEUE_STAT_CNTRS;
-
 	/* TX stats */
-	for (i = 0; i < nq; i++) {
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
 		mq = dev->data->tx_queues[i];
-		stats->q_opackets[i] = mq->n_pkts;
-		stats->q_obytes[i] = mq->n_bytes;
+		if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
+			stats->q_opackets[i] = mq->n_pkts;
+			stats->q_obytes[i] = mq->n_bytes;
+		}
 		stats->opackets += mq->n_pkts;
 		stats->obytes += mq->n_bytes;
 	}
@@ -1636,20 +1623,18 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 static int
 memif_stats_reset(struct rte_eth_dev *dev)
 {
-	struct pmd_internals *pmd = dev->data->dev_private;
-	int i;
 	struct memif_queue *mq;
+	unsigned int i;
 
-	for (i = 0; i < pmd->run.num_c2s_rings; i++) {
-		mq = (pmd->role == MEMIF_ROLE_CLIENT) ? dev->data->tx_queues[i] :
-		    dev->data->rx_queues[i];
+	/* Same as memif_stats_get(), pmd->run is cleared on disconnect. */
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		mq = dev->data->rx_queues[i];
 		mq->n_pkts = 0;
 		mq->n_bytes = 0;
 		mq->n_err = 0;
 	}
-	for (i = 0; i < pmd->run.num_s2c_rings; i++) {
-		mq = (pmd->role == MEMIF_ROLE_CLIENT) ? dev->data->rx_queues[i] :
-		    dev->data->tx_queues[i];
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		mq = dev->data->tx_queues[i];
 		mq->n_pkts = 0;
 		mq->n_bytes = 0;
 		mq->n_err = 0;
-- 
2.47.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2026-10-27 11:43:58.790381087 +0000
+++ 0132-net-memif-fix-statistics.patch	2026-10-27 11:43:53.654063782 +0000
@@ -1 +1 @@
-From e7793922cca0649008ce26aaebccfcb8e3daf2b6 Mon Sep 17 00:00:00 2001
+From 4a42f0be9a0830a23e89cbaaea213a42639a6e19 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit e7793922cca0649008ce26aaebccfcb8e3daf2b6 ]
+
@@ -19 +20,0 @@
-Cc: stable at dpdk.org
@@ -23,2 +24,2 @@
- drivers/net/memif/rte_eth_memif.c | 37 ++++++++-----------------------
- 1 file changed, 9 insertions(+), 28 deletions(-)
+ drivers/net/memif/rte_eth_memif.c | 49 +++++++++++--------------------
+ 1 file changed, 17 insertions(+), 32 deletions(-)
@@ -27 +28 @@
-index 1c8dc1d5ec..11df159b2d 100644
+index 28a06abe0a6..cf03ee1a878 100644
@@ -30,3 +31,3 @@
-@@ -1595,23 +1595,11 @@ static int
- memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,
- 		struct eth_queue_stats *qstats)
+@@ -1592,41 +1592,28 @@ memif_link_update(struct rte_eth_dev *dev,
+ static int
+ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
@@ -46,2 +47,2 @@
--	nq = (tmp < dev->data->nb_rx_queues) ? tmp :
--	    dev->data->nb_rx_queues;
+-	nq = (tmp < RTE_ETHDEV_QUEUE_STAT_CNTRS) ? tmp :
+-	    RTE_ETHDEV_QUEUE_STAT_CNTRS;
@@ -54,3 +55,8 @@
- 		if (qstats != NULL) {
- 			qstats[i].q_ipackets = mq->n_pkts;
-@@ -1622,13 +1610,8 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,
+-		stats->q_ipackets[i] = mq->n_pkts;
+-		stats->q_ibytes[i] = mq->n_bytes;
++		if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
++			stats->q_ipackets[i] = mq->n_pkts;
++			stats->q_ibytes[i] = mq->n_bytes;
++		}
+ 		stats->ipackets += mq->n_pkts;
+ 		stats->ibytes += mq->n_bytes;
@@ -62,2 +68,2 @@
--	nq = (tmp < dev->data->nb_tx_queues) ? tmp :
--	    dev->data->nb_tx_queues;
+-	nq = (tmp < RTE_ETHDEV_QUEUE_STAT_CNTRS) ? tmp :
+-	    RTE_ETHDEV_QUEUE_STAT_CNTRS;
@@ -69,3 +75,10 @@
- 		if (qstats != NULL) {
- 			qstats[i].q_opackets = mq->n_pkts;
-@@ -1643,20 +1626,18 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,
+-		stats->q_opackets[i] = mq->n_pkts;
+-		stats->q_obytes[i] = mq->n_bytes;
++		if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
++			stats->q_opackets[i] = mq->n_pkts;
++			stats->q_obytes[i] = mq->n_bytes;
++		}
+ 		stats->opackets += mq->n_pkts;
+ 		stats->obytes += mq->n_bytes;
+ 	}
+@@ -1636,20 +1623,18 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)


More information about the stable mailing list