]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
eth: fbnic: report software Tx queue stats
authorJakub Kicinski <kuba@kernel.org>
Tue, 11 Feb 2025 18:13:55 +0000 (10:13 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 13 Feb 2025 00:39:05 +0000 (16:39 -0800)
Gather and report software Tx queue stats - checksum stats
and queue stop / start.

Acked-by: Joe Damato <jdamato@fastly.com>
Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Link: https://patch.msgid.link/20250211181356.580800-5-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
drivers/net/ethernet/meta/fbnic/fbnic_txrx.c
drivers/net/ethernet/meta/fbnic/fbnic_txrx.h

index ceb6d1de9bcf68caf65eaf5188102df893672006..b12672d1607e9ec438b8d78c653eb97f7e164a18 100644 (file)
@@ -517,6 +517,7 @@ static void fbnic_get_queue_stats_tx(struct net_device *dev, int idx,
        struct fbnic_net *fbn = netdev_priv(dev);
        struct fbnic_ring *txr = fbn->tx[idx];
        struct fbnic_queue_stats *stats;
+       u64 stop, wake, csum;
        unsigned int start;
        u64 bytes, packets;
 
@@ -528,10 +529,16 @@ static void fbnic_get_queue_stats_tx(struct net_device *dev, int idx,
                start = u64_stats_fetch_begin(&stats->syncp);
                bytes = stats->bytes;
                packets = stats->packets;
+               csum = stats->twq.csum_partial;
+               stop = stats->twq.stop;
+               wake = stats->twq.wake;
        } while (u64_stats_fetch_retry(&stats->syncp, start));
 
        tx->bytes = bytes;
        tx->packets = packets;
+       tx->needs_csum = csum;
+       tx->stop = stop;
+       tx->wake = wake;
 }
 
 static void fbnic_get_base_stats(struct net_device *dev,
@@ -542,6 +549,9 @@ static void fbnic_get_base_stats(struct net_device *dev,
 
        tx->bytes = fbn->tx_stats.bytes;
        tx->packets = fbn->tx_stats.packets;
+       tx->needs_csum = fbn->tx_stats.twq.csum_partial;
+       tx->stop = fbn->tx_stats.twq.stop;
+       tx->wake = fbn->tx_stats.twq.wake;
 
        rx->bytes = fbn->rx_stats.bytes;
        rx->packets = fbn->rx_stats.packets;
index 66ba36fd3c081e323c53ed99185ec95fcc3eed37..24d2b528b66c02f622e0564e15c8b307b5c3b1fb 100644 (file)
@@ -113,6 +113,11 @@ static int fbnic_maybe_stop_tx(const struct net_device *dev,
 
        res = netif_txq_maybe_stop(txq, fbnic_desc_unused(ring), size,
                                   FBNIC_TX_DESC_WAKEUP);
+       if (!res) {
+               u64_stats_update_begin(&ring->stats.syncp);
+               ring->stats.twq.stop++;
+               u64_stats_update_end(&ring->stats.syncp);
+       }
 
        return !res;
 }
@@ -191,6 +196,9 @@ fbnic_tx_offloads(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
                                        skb->csum_offset / 2));
 
        *meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_CSO);
+       u64_stats_update_begin(&ring->stats.syncp);
+       ring->stats.twq.csum_partial++;
+       u64_stats_update_end(&ring->stats.syncp);
 
        *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L2_HLEN_MASK, l2len / 2) |
                             FIELD_PREP(FBNIC_TWD_L3_IHLEN_MASK, i3len / 2));
@@ -460,9 +468,13 @@ static void fbnic_clean_twq0(struct fbnic_napi_vector *nv, int napi_budget,
        ring->stats.packets += total_packets;
        u64_stats_update_end(&ring->stats.syncp);
 
-       netif_txq_completed_wake(txq, total_packets, total_bytes,
-                                fbnic_desc_unused(ring),
-                                FBNIC_TX_DESC_WAKEUP);
+       if (!netif_txq_completed_wake(txq, total_packets, total_bytes,
+                                     fbnic_desc_unused(ring),
+                                     FBNIC_TX_DESC_WAKEUP)) {
+               u64_stats_update_begin(&ring->stats.syncp);
+               ring->stats.twq.wake++;
+               u64_stats_update_end(&ring->stats.syncp);
+       }
 }
 
 static void fbnic_clean_tsq(struct fbnic_napi_vector *nv,
@@ -1092,10 +1104,13 @@ void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
        fbn->tx_stats.bytes += stats->bytes;
        fbn->tx_stats.packets += stats->packets;
        fbn->tx_stats.dropped += stats->dropped;
+       fbn->tx_stats.twq.csum_partial += stats->twq.csum_partial;
        fbn->tx_stats.twq.ts_lost += stats->twq.ts_lost;
        fbn->tx_stats.twq.ts_packets += stats->twq.ts_packets;
+       fbn->tx_stats.twq.stop += stats->twq.stop;
+       fbn->tx_stats.twq.wake += stats->twq.wake;
        /* Remember to add new stats here */
-       BUILD_BUG_ON(sizeof(fbn->tx_stats.twq) / 8 != 2);
+       BUILD_BUG_ON(sizeof(fbn->tx_stats.twq) / 8 != 5);
 }
 
 static void fbnic_remove_tx_ring(struct fbnic_net *fbn,
index c9d9001042dc21c1c89d36e826a7a49272ab1805..b53a7d28ecd3650d5a64ab508458b7b2dbbc7c30 100644 (file)
@@ -58,8 +58,11 @@ struct fbnic_queue_stats {
        u64 bytes;
        union {
                struct {
+                       u64 csum_partial;
                        u64 ts_packets;
                        u64 ts_lost;
+                       u64 stop;
+                       u64 wake;
                } twq;
                struct {
                        u64 alloc_failed;