gve: Add consumed counts to ethtool stats
authorJordan Kim <jrkim@google.com>
Thu, 16 Dec 2021 00:46:51 +0000 (16:46 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Dec 2021 10:41:54 +0000 (10:41 +0000)
Being able to see how many descriptors are in-use is helpful
when diagnosing certain issues.

Signed-off-by: Jeroen de Borst <jeroendb@google.com>
Signed-off-by: Jordan Kim <jrkim@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/google/gve/gve_ethtool.c

index fd2d2c7..e0815bb 100644 (file)
@@ -42,7 +42,7 @@ static const char gve_gstrings_main_stats[][ETH_GSTRING_LEN] = {
 };
 
 static const char gve_gstrings_rx_stats[][ETH_GSTRING_LEN] = {
-       "rx_posted_desc[%u]", "rx_completed_desc[%u]", "rx_bytes[%u]",
+       "rx_posted_desc[%u]", "rx_completed_desc[%u]", "rx_consumed_desc[%u]", "rx_bytes[%u]",
        "rx_cont_packet_cnt[%u]", "rx_frag_flip_cnt[%u]", "rx_frag_copy_cnt[%u]",
        "rx_dropped_pkt[%u]", "rx_copybreak_pkt[%u]", "rx_copied_pkt[%u]",
        "rx_queue_drop_cnt[%u]", "rx_no_buffers_posted[%u]",
@@ -50,7 +50,7 @@ static const char gve_gstrings_rx_stats[][ETH_GSTRING_LEN] = {
 };
 
 static const char gve_gstrings_tx_stats[][ETH_GSTRING_LEN] = {
-       "tx_posted_desc[%u]", "tx_completed_desc[%u]", "tx_bytes[%u]",
+       "tx_posted_desc[%u]", "tx_completed_desc[%u]", "tx_consumed_desc[%u]", "tx_bytes[%u]",
        "tx_wake[%u]", "tx_stop[%u]", "tx_event_counter[%u]",
        "tx_dma_mapping_error[%u]",
 };
@@ -139,10 +139,11 @@ static void
 gve_get_ethtool_stats(struct net_device *netdev,
                      struct ethtool_stats *stats, u64 *data)
 {
-       u64 tmp_rx_pkts, tmp_rx_bytes, tmp_rx_skb_alloc_fail,   tmp_rx_buf_alloc_fail,
-               tmp_rx_desc_err_dropped_pkt, tmp_tx_pkts, tmp_tx_bytes;
+       u64 tmp_rx_pkts, tmp_rx_bytes, tmp_rx_skb_alloc_fail,
+               tmp_rx_buf_alloc_fail, tmp_rx_desc_err_dropped_pkt,
+               tmp_tx_pkts, tmp_tx_bytes;
        u64 rx_buf_alloc_fail, rx_desc_err_dropped_pkt, rx_pkts,
-               rx_skb_alloc_fail, rx_bytes, tx_pkts, tx_bytes;
+               rx_skb_alloc_fail, rx_bytes, tx_pkts, tx_bytes, tx_dropped;
        int stats_idx, base_stats_idx, max_stats_idx;
        struct stats *report_stats;
        int *rx_qid_to_stats_idx;
@@ -191,7 +192,7 @@ gve_get_ethtool_stats(struct net_device *netdev,
                        rx_desc_err_dropped_pkt += tmp_rx_desc_err_dropped_pkt;
                }
        }
-       for (tx_pkts = 0, tx_bytes = 0, ring = 0;
+       for (tx_pkts = 0, tx_bytes = 0, tx_dropped = 0, ring = 0;
             ring < priv->tx_cfg.num_queues; ring++) {
                if (priv->tx) {
                        do {
@@ -203,6 +204,7 @@ gve_get_ethtool_stats(struct net_device *netdev,
                                                       start));
                        tx_pkts += tmp_tx_pkts;
                        tx_bytes += tmp_tx_bytes;
+                       tx_dropped += priv->tx[ring].dropped_pkt;
                }
        }
 
@@ -214,9 +216,7 @@ gve_get_ethtool_stats(struct net_device *netdev,
        /* total rx dropped packets */
        data[i++] = rx_skb_alloc_fail + rx_buf_alloc_fail +
                    rx_desc_err_dropped_pkt;
-       /* Skip tx_dropped */
-       i++;
-
+       data[i++] = tx_dropped;
        data[i++] = priv->tx_timeo_cnt;
        data[i++] = rx_skb_alloc_fail;
        data[i++] = rx_buf_alloc_fail;
@@ -255,6 +255,7 @@ gve_get_ethtool_stats(struct net_device *netdev,
 
                        data[i++] = rx->fill_cnt;
                        data[i++] = rx->cnt;
+                       data[i++] = rx->fill_cnt - rx->cnt;
                        do {
                                start =
                                  u64_stats_fetch_begin(&priv->rx[ring].statss);
@@ -318,12 +319,14 @@ gve_get_ethtool_stats(struct net_device *netdev,
                        if (gve_is_gqi(priv)) {
                                data[i++] = tx->req;
                                data[i++] = tx->done;
+                               data[i++] = tx->req - tx->done;
                        } else {
                                /* DQO doesn't currently support
                                 * posted/completed descriptor counts;
                                 */
                                data[i++] = 0;
                                data[i++] = 0;
+                               data[i++] = tx->dqo_tx.tail - tx->dqo_tx.head;
                        }
                        do {
                                start =