[PATCH net v2] ixgbe: implement get_queue_stats_rx

From: Kshitiz Bartariya

Date: Tue May 26 2026 - 03:52:14 EST


Hook into the netdev_stat_ops interface to expose per RX queue
statistics through the netdev generic netlink API.

The following counters are filled:

- alloc_fail: sum of alloc_rx_page_failed and alloc_rx_buff_failed

- csum_bad: maps directly to csum_err, which is incremented for both
IP header and L4 checksum errors in ixgbe_rx_checksum().

Signed-off-by: Kshitiz Bartariya <kshitiz.bartariya@xxxxxxxxxxx>
---
v2:
- Removed setting of hw_gro counters as ixgbe doesn't advertise it
- Removed idx and ring checks as they are already checked against
real_num_rx_queues
Thanks Jakub Kicinski for the review comments.

v1: https://lore.kernel.org/lkml/20260523144022.36484-1-kshitiz.bartariya@xxxxxxxxxxx/


drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 2646ee6f295f..2184213727c7 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -9740,6 +9740,21 @@ static void ixgbe_get_stats64(struct net_device *netdev,
stats->rx_missed_errors = netdev->stats.rx_missed_errors;
}

+static void ixgbe_get_queue_stats_rx(struct net_device *dev, int idx,
+ struct netdev_queue_stats_rx *stats)
+{
+ struct ixgbe_adapter *adapter = ixgbe_from_netdev(dev);
+ struct ixgbe_ring *ring = adapter->rx_ring[idx];
+
+ stats->alloc_fail = ring->rx_stats.alloc_rx_page_failed +
+ ring->rx_stats.alloc_rx_buff_failed;
+ stats->csum_bad = ring->rx_stats.csum_err;
+}
+
+static const struct netdev_stat_ops ixgbe_stat_ops = {
+ .get_queue_stats_rx = ixgbe_get_queue_stats_rx,
+};
+
static int ixgbe_ndo_get_vf_stats(struct net_device *netdev, int vf,
struct ifla_vf_stats *vf_stats)
{
@@ -11643,6 +11658,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
hw->phy.mdio.mdio_write = ixgbe_mdio_write;

netdev->netdev_ops = &ixgbe_netdev_ops;
+ netdev->stat_ops = &ixgbe_stat_ops;
ixgbe_set_ethtool_ops(netdev);
netdev->watchdog_timeo = 5 * HZ;
strscpy(netdev->name, pci_name(pdev), sizeof(netdev->name));
--
2.50.1 (Apple Git-155)