net: ethtool: require drivers to set supported_coalesce_params

Now that all in-tree drivers have been updated we can
make the supported_coalesce_params mandatory.

To save debugging time in case some driver was missed
(or is out of tree) add a warning when netdev is registered
with set_coalesce but without supported_coalesce_params.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Michal Kubecek <mkubecek@suse.cz>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jakub Kicinski 2020-03-16 13:47:12 -07:00 committed by David S. Miller
parent 329bab6ea9
commit 9000edb71a
4 changed files with 17 additions and 3 deletions

View File

@ -458,6 +458,8 @@ struct ethtool_ops {
struct ethtool_stats *, u64 *); struct ethtool_stats *, u64 *);
}; };
int ethtool_check_ops(const struct ethtool_ops *ops);
struct ethtool_rx_flow_rule { struct ethtool_rx_flow_rule {
struct flow_rule *rule; struct flow_rule *rule;
unsigned long priv[0]; unsigned long priv[0];

View File

@ -9283,6 +9283,10 @@ int register_netdevice(struct net_device *dev)
BUG_ON(dev->reg_state != NETREG_UNINITIALIZED); BUG_ON(dev->reg_state != NETREG_UNINITIALIZED);
BUG_ON(!net); BUG_ON(!net);
ret = ethtool_check_ops(dev->ethtool_ops);
if (ret)
return ret;
spin_lock_init(&dev->addr_list_lock); spin_lock_init(&dev->addr_list_lock);
lockdep_set_class(&dev->addr_list_lock, &dev->addr_list_lock_key); lockdep_set_class(&dev->addr_list_lock, &dev->addr_list_lock_key);

View File

@ -289,3 +289,14 @@ out:
kfree(indir); kfree(indir);
return ret; return ret;
} }
int ethtool_check_ops(const struct ethtool_ops *ops)
{
if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
return -EINVAL;
/* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
* the fact that ops are checked at registration time does not
* mean the ops attached to a netdev later on are sane.
*/
return 0;
}

View File

@ -1519,9 +1519,6 @@ ethtool_set_coalesce_supported(struct net_device *dev,
u32 supported_params = dev->ethtool_ops->supported_coalesce_params; u32 supported_params = dev->ethtool_ops->supported_coalesce_params;
u32 nonzero_params = 0; u32 nonzero_params = 0;
if (!supported_params)
return true;
if (coalesce->rx_coalesce_usecs) if (coalesce->rx_coalesce_usecs)
nonzero_params |= ETHTOOL_COALESCE_RX_USECS; nonzero_params |= ETHTOOL_COALESCE_RX_USECS;
if (coalesce->rx_max_coalesced_frames) if (coalesce->rx_max_coalesced_frames)