]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
gve: add support for basic queue stats
authorHarshitha Ramamurthy <hramamurthy@google.com>
Mon, 14 Oct 2024 20:21:08 +0000 (13:21 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 16 Oct 2024 01:50:10 +0000 (18:50 -0700)
Implement netdev_stats_ops to export basic per-queue stats.

With page pool support for DQO added in the previous patches,
rx-alloc-fail captures failures in page pool allocations as
well since the rx_buf_alloc_fail stat tracked in the driver
is incremented when gve_alloc_buffer returns error.

Reviewed-by: Praveen Kaligineedi <pkaligineedi@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Harshitha Ramamurthy <hramamurthy@google.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20241014202108.1051963-4-pkaligineedi@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/google/gve/gve_main.c

index 294ddcd0bf6c690e07a1f4125764366d8aa229ed..e171ca248f9af62275b6de656b0904ebe3dec583 100644 (file)
@@ -2561,6 +2561,54 @@ static const struct netdev_queue_mgmt_ops gve_queue_mgmt_ops = {
        .ndo_queue_stop         =       gve_rx_queue_stop,
 };
 
+static void gve_get_rx_queue_stats(struct net_device *dev, int idx,
+                                  struct netdev_queue_stats_rx *rx_stats)
+{
+       struct gve_priv *priv = netdev_priv(dev);
+       struct gve_rx_ring *rx = &priv->rx[idx];
+       unsigned int start;
+
+       do {
+               start = u64_stats_fetch_begin(&rx->statss);
+               rx_stats->packets = rx->rpackets;
+               rx_stats->bytes = rx->rbytes;
+               rx_stats->alloc_fail = rx->rx_skb_alloc_fail +
+                                      rx->rx_buf_alloc_fail;
+       } while (u64_stats_fetch_retry(&rx->statss, start));
+}
+
+static void gve_get_tx_queue_stats(struct net_device *dev, int idx,
+                                  struct netdev_queue_stats_tx *tx_stats)
+{
+       struct gve_priv *priv = netdev_priv(dev);
+       struct gve_tx_ring *tx = &priv->tx[idx];
+       unsigned int start;
+
+       do {
+               start = u64_stats_fetch_begin(&tx->statss);
+               tx_stats->packets = tx->pkt_done;
+               tx_stats->bytes = tx->bytes_done;
+       } while (u64_stats_fetch_retry(&tx->statss, start));
+}
+
+static void gve_get_base_stats(struct net_device *dev,
+                              struct netdev_queue_stats_rx *rx,
+                              struct netdev_queue_stats_tx *tx)
+{
+       rx->packets = 0;
+       rx->bytes = 0;
+       rx->alloc_fail = 0;
+
+       tx->packets = 0;
+       tx->bytes = 0;
+}
+
+static const struct netdev_stat_ops gve_stat_ops = {
+       .get_queue_stats_rx     = gve_get_rx_queue_stats,
+       .get_queue_stats_tx     = gve_get_tx_queue_stats,
+       .get_base_stats         = gve_get_base_stats,
+};
+
 static int gve_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int max_tx_queues, max_rx_queues;
@@ -2616,6 +2664,7 @@ static int gve_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        dev->ethtool_ops = &gve_ethtool_ops;
        dev->netdev_ops = &gve_netdev_ops;
        dev->queue_mgmt_ops = &gve_queue_mgmt_ops;
+       dev->stat_ops = &gve_stat_ops;
 
        /* Set default and supported features.
         *