ethtool: Add support for configuring PFC stall prevention in ethtool
authorInbar Karmy <inbark@mellanox.com>
Mon, 20 Nov 2017 14:14:30 +0000 (16:14 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Mon, 26 Mar 2018 20:46:46 +0000 (13:46 -0700)
In the event where the device unexpectedly becomes unresponsive
for a long period of time, flow control mechanism may propagate
pause frames which will cause congestion spreading to the entire
network.
To prevent this scenario, when the device is stalled for a period
longer than a pre-configured timeout, flow control mechanisms are
automatically disabled.

This patch adds support for the ETHTOOL_PFC_STALL_PREVENTION
as a tunable.
This API provides support for configuring flow control storm prevention
timeout (msec).

Signed-off-by: Inbar Karmy <inbark@mellanox.com>
Cc: Michal Kubecek <mkubecek@suse.cz>
Cc: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
include/uapi/linux/ethtool.h
net/core/ethtool.c

index 20da156..4ca65b5 100644 (file)
@@ -217,10 +217,14 @@ struct ethtool_value {
        __u32   data;
 };
 
+#define PFC_STORM_PREVENTION_AUTO      0xffff
+#define PFC_STORM_PREVENTION_DISABLE   0
+
 enum tunable_id {
        ETHTOOL_ID_UNSPEC,
        ETHTOOL_RX_COPYBREAK,
        ETHTOOL_TX_COPYBREAK,
+       ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */
        /*
         * Add your fresh new tubale attribute above and remember to update
         * tunable_strings[] in net/core/ethtool.c
index 157cd9e..bb6e498 100644 (file)
@@ -121,6 +121,7 @@ tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
        [ETHTOOL_ID_UNSPEC]     = "Unspec",
        [ETHTOOL_RX_COPYBREAK]  = "rx-copybreak",
        [ETHTOOL_TX_COPYBREAK]  = "tx-copybreak",
+       [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
 };
 
 static const char
@@ -2311,6 +2312,11 @@ static int ethtool_tunable_valid(const struct ethtool_tunable *tuna)
                    tuna->type_id != ETHTOOL_TUNABLE_U32)
                        return -EINVAL;
                break;
+       case ETHTOOL_PFC_PREVENTION_TOUT:
+               if (tuna->len != sizeof(u16) ||
+                   tuna->type_id != ETHTOOL_TUNABLE_U16)
+                       return -EINVAL;
+               break;
        default:
                return -EINVAL;
        }