]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: ethtool: Track pause storm events
authorMohsin Bashir <mohsin.bashr@gmail.com>
Mon, 2 Mar 2026 23:01:45 +0000 (15:01 -0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 5 Mar 2026 15:26:52 +0000 (16:26 +0100)
With TX pause enabled, if a device is unable to pass packets up to the
stack (e.g., CPU is hanged), the device can cause pause storm. Given
that devices can have native support to protect the neighbor from such
flooding, such events need some tracking. This support is to track TX
pause storm events for better observability.

Reviewed-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com>
Link: https://patch.msgid.link/20260302230149.1580195-2-mohsin.bashr@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Documentation/netlink/specs/ethtool.yaml
include/linux/ethtool.h
include/uapi/linux/ethtool_netlink_generated.h
net/ethtool/pause.c

index 0a2d2343f79ac8e1848b845e31b4393d3b0a92ee..4707063af3b499174a166a94169479b71a72880b 100644 (file)
@@ -879,6 +879,19 @@ attribute-sets:
       -
         name: rx-frames
         type: u64
+      -
+        name: tx-pause-storm-events
+        type: u64
+        doc: >-
+            TX pause storm event count. Increments each time device
+            detects that its pause assertion condition has been true
+            for too long for normal operation. As a result, the device
+            has temporarily disabled its own Pause TX function to
+            protect the network from itself.
+            This counter should never increment under normal overload
+            conditions; it indicates catastrophic failure like an OS
+            crash. The rate of incrementing is implementation specific.
+
   -
     name: pause
     attr-cnt-name: __ethtool-a-pause-cnt
index 798abec67a1b054d25f628af121b406b90b4d70c..83c3758408357106c6bb707c9413bccf85d69b3f 100644 (file)
@@ -512,12 +512,14 @@ struct ethtool_eth_ctrl_stats {
  *
  *     Equivalent to `30.3.4.3 aPAUSEMACCtrlFramesReceived`
  *     from the standard.
+ * @tx_pause_storm_events: TX pause storm event count (see ethtool.yaml).
  */
 struct ethtool_pause_stats {
        enum ethtool_mac_stats_src src;
        struct_group(stats,
                u64 tx_pause_frames;
                u64 rx_pause_frames;
+               u64 tx_pause_storm_events;
        );
 };
 
index 556a0c834df53e84228002f0e24bd07d023e3454..114b8301729739c2c9ff49adf53c6990daefbc4b 100644 (file)
@@ -381,6 +381,7 @@ enum {
        ETHTOOL_A_PAUSE_STAT_PAD,
        ETHTOOL_A_PAUSE_STAT_TX_FRAMES,
        ETHTOOL_A_PAUSE_STAT_RX_FRAMES,
+       ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS,
 
        __ETHTOOL_A_PAUSE_STAT_CNT,
        ETHTOOL_A_PAUSE_STAT_MAX = (__ETHTOOL_A_PAUSE_STAT_CNT - 1)
index 0f9af1e6654842cbdbfd49983dc2956e68e201cb..5d28f642764c37ebaab40199d9e93793a1cb2616 100644 (file)
@@ -130,7 +130,9 @@ static int pause_put_stats(struct sk_buff *skb,
        if (ethtool_put_stat(skb, pause_stats->tx_pause_frames,
                             ETHTOOL_A_PAUSE_STAT_TX_FRAMES, pad) ||
            ethtool_put_stat(skb, pause_stats->rx_pause_frames,
-                            ETHTOOL_A_PAUSE_STAT_RX_FRAMES, pad))
+                            ETHTOOL_A_PAUSE_STAT_RX_FRAMES, pad) ||
+           ethtool_put_stat(skb, pause_stats->tx_pause_storm_events,
+                            ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS, pad))
                goto err_cancel;
 
        nla_nest_end(skb, nest);