net: add netdev_sw_irq_coalesce_default_on()
authorHeiner Kallweit <hkallweit1@gmail.com>
Wed, 30 Nov 2022 22:28:26 +0000 (23:28 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Dec 2022 21:48:36 +0000 (21:48 +0000)
Add a helper for drivers wanting to set SW IRQ coalescing
by default. The related sysfs attributes can be used to
override the default values.

Follow Jakub's suggestion and put this functionality into
net core so that drivers wanting to use software interrupt
coalescing per default don't have to open-code it.

Note that this function needs to be called before the
netdevice is registered.

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
net/core/dev.c

index 5aa35c58c342b53d76ec1e5e9f02f1bb7d3a778c..f78db610ada5f1fa2edf1389fc9406089d7136d1 100644 (file)
@@ -78,6 +78,7 @@ struct xdp_buff;
 void synchronize_net(void);
 void netdev_set_default_ethtool_ops(struct net_device *dev,
                                    const struct ethtool_ops *ops);
+void netdev_sw_irq_coalesce_default_on(struct net_device *dev);
 
 /* Backlog congestion levels */
 #define NET_RX_SUCCESS         0       /* keep 'em coming, baby */
index 7627c475d991bfeb7138e0868d423e654d46f036..b76fb37b381e96af8d52dbadca163202eb4f3ccb 100644 (file)
@@ -10517,6 +10517,22 @@ void netdev_set_default_ethtool_ops(struct net_device *dev,
 }
 EXPORT_SYMBOL_GPL(netdev_set_default_ethtool_ops);
 
+/**
+ * netdev_sw_irq_coalesce_default_on() - enable SW IRQ coalescing by default
+ * @dev: netdev to enable the IRQ coalescing on
+ *
+ * Sets a conservative default for SW IRQ coalescing. Users can use
+ * sysfs attributes to override the default values.
+ */
+void netdev_sw_irq_coalesce_default_on(struct net_device *dev)
+{
+       WARN_ON(dev->reg_state == NETREG_REGISTERED);
+
+       dev->gro_flush_timeout = 20000;
+       dev->napi_defer_hard_irqs = 1;
+}
+EXPORT_SYMBOL_GPL(netdev_sw_irq_coalesce_default_on);
+
 void netdev_freemem(struct net_device *dev)
 {
        char *addr = (char *)dev - dev->padded;