[PATCH v2 6/7] net/netvsc: forward per-queue stats from VF device

Long Li longli at microsoft.com
Wed May 6 04:05:27 CEST 2026


hn_vf_stats_get was ignoring the qstats parameter (__rte_unused),
calling rte_eth_stats_get which only collects aggregate stats. This
meant per-queue stats (rx_q0_good_packets, tx_q0_good_packets, etc.)
were always zero when VF datapath was active, even though the
underlying MANA driver populates them in its stats_get callback.

Call the VF device's stats_get op directly with the qstats pointer
so per-queue counters are forwarded through netvsc to the xstats
telemetry output.

Fixes: dc7680e8597c ("net/netvsc: support integrated VF")
Cc: stable at dpdk.org
Signed-off-by: Long Li <longli at microsoft.com>
---
v2:
- Added comment explaining why dev_ops->stats_get is called
  directly (per-queue stats not available via public API)
- Added -ENOTSUP fallback to rte_eth_stats_get for VF drivers
  that do not support per-queue stats
- Changed implicit NULL check to explicit (stats_get != NULL)

 drivers/net/netvsc/hn_vf.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c
index 1fcc65a712..49e6a5b283 100644
--- a/drivers/net/netvsc/hn_vf.c
+++ b/drivers/net/netvsc/hn_vf.c
@@ -749,7 +749,7 @@ void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id)
 
 int hn_vf_stats_get(struct rte_eth_dev *dev,
 		    struct rte_eth_stats *stats,
-		    struct eth_queue_stats *qstats __rte_unused)
+		    struct eth_queue_stats *qstats)
 {
 	struct hn_data *hv = dev->data->dev_private;
 	struct rte_eth_dev *vf_dev;
@@ -757,8 +757,22 @@ int hn_vf_stats_get(struct rte_eth_dev *dev,
 
 	rte_rwlock_read_lock(&hv->vf_lock);
 	vf_dev = hn_get_vf_dev(hv);
-	if (vf_dev)
-		ret = rte_eth_stats_get(vf_dev->data->port_id, stats);
+	if (vf_dev) {
+		/* Call dev_ops->stats_get directly instead of the public
+		 * rte_eth_stats_get API because we need to forward the
+		 * per-queue stats (qstats) which the public API does not
+		 * support.  Fall back to the public API if the VF driver
+		 * does not implement stats_get or returns -ENOTSUP.
+		 */
+		if (vf_dev->dev_ops->stats_get != NULL) {
+			ret = vf_dev->dev_ops->stats_get(vf_dev, stats, qstats);
+			if (ret == -ENOTSUP)
+				ret = rte_eth_stats_get(vf_dev->data->port_id,
+							stats);
+		} else {
+			ret = rte_eth_stats_get(vf_dev->data->port_id, stats);
+		}
+	}
 	rte_rwlock_read_unlock(&hv->vf_lock);
 	return ret;
 }
-- 
2.43.0



More information about the dev mailing list