net: ena: ethtool: add stats printing to XDP queues
authorSameeh Jubran <sameehj@amazon.com>
Thu, 10 Sep 2020 13:07:12 +0000 (13:07 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Sep 2020 22:12:27 +0000 (15:12 -0700)
Added statistics for TX queues that are used for XDP TX. The statistics
are the same as the ones printed for regular non-XDP TX queues.

The XDP queue statistics can be queried using
`ethtool -S <ifname>`

Signed-off-by: Shay Agroskin <shayagr@amazon.com>
Signed-off-by: Sameeh Jubran <sameehj@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amazon/ena/ena_ethtool.c

index 07e9f3d..137a36a 100644 (file)
@@ -152,7 +152,7 @@ static void ena_queue_stats(struct ena_adapter *adapter, u64 **data)
        u64 *ptr;
        int i, j;
 
-       for (i = 0; i < adapter->num_io_queues; i++) {
+       for (i = 0; i < adapter->num_io_queues + adapter->xdp_num_queues; i++) {
                /* Tx stats */
                ring = &adapter->tx_ring[i];
 
@@ -163,17 +163,19 @@ static void ena_queue_stats(struct ena_adapter *adapter, u64 **data)
 
                        ena_safe_update_stat(ptr, (*data)++, &ring->syncp);
                }
+               /* XDP TX queues don't have a RX queue counterpart */
+               if (!ENA_IS_XDP_INDEX(adapter, i)) {
+                       /* Rx stats */
+                       ring = &adapter->rx_ring[i];
 
-               /* Rx stats */
-               ring = &adapter->rx_ring[i];
+                       for (j = 0; j < ENA_STATS_ARRAY_RX; j++) {
+                               ena_stats = &ena_stats_rx_strings[j];
 
-               for (j = 0; j < ENA_STATS_ARRAY_RX; j++) {
-                       ena_stats = &ena_stats_rx_strings[j];
+                               ptr = (u64 *)&ring->rx_stats +
+                                       ena_stats->stat_offset;
 
-                       ptr = (u64 *)&ring->rx_stats +
-                               ena_stats->stat_offset;
-
-                       ena_safe_update_stat(ptr, (*data)++, &ring->syncp);
+                               ena_safe_update_stat(ptr, (*data)++, &ring->syncp);
+                       }
                }
        }
 }
@@ -238,6 +240,7 @@ static void ena_get_ethtool_stats(struct net_device *netdev,
 static int ena_get_sw_stats_count(struct ena_adapter *adapter)
 {
        return adapter->num_io_queues * (ENA_STATS_ARRAY_TX + ENA_STATS_ARRAY_RX)
+               + adapter->xdp_num_queues * ENA_STATS_ARRAY_TX
                + ENA_STATS_ARRAY_GLOBAL + ENA_STATS_ARRAY_ENA_COM;
 }
 
@@ -259,24 +262,32 @@ int ena_get_sset_count(struct net_device *netdev, int sset)
 static void ena_queue_strings(struct ena_adapter *adapter, u8 **data)
 {
        const struct ena_stats *ena_stats;
+       bool is_xdp;
        int i, j;
 
-       for (i = 0; i < adapter->num_io_queues; i++) {
+       for (i = 0; i < adapter->num_io_queues + adapter->xdp_num_queues; i++) {
+               is_xdp = ENA_IS_XDP_INDEX(adapter, i);
                /* Tx stats */
                for (j = 0; j < ENA_STATS_ARRAY_TX; j++) {
                        ena_stats = &ena_stats_tx_strings[j];
 
                        snprintf(*data, ETH_GSTRING_LEN,
-                                "queue_%u_tx_%s", i, ena_stats->name);
+                                "queue_%u_%s_%s", i,
+                                is_xdp ? "xdp_tx" : "tx", ena_stats->name);
                        (*data) += ETH_GSTRING_LEN;
                }
-               /* Rx stats */
-               for (j = 0; j < ENA_STATS_ARRAY_RX; j++) {
-                       ena_stats = &ena_stats_rx_strings[j];
 
-                       snprintf(*data, ETH_GSTRING_LEN,
-                                "queue_%u_rx_%s", i, ena_stats->name);
-                       (*data) += ETH_GSTRING_LEN;
+               if (!is_xdp) {
+                       /* RX stats, in XDP there isn't a RX queue
+                        * counterpart
+                        */
+                       for (j = 0; j < ENA_STATS_ARRAY_RX; j++) {
+                               ena_stats = &ena_stats_rx_strings[j];
+
+                               snprintf(*data, ETH_GSTRING_LEN,
+                                        "queue_%u_rx_%s", i, ena_stats->name);
+                               (*data) += ETH_GSTRING_LEN;
+                       }
                }
        }
 }