On 20.08.21 10:35, Yufeng Mo wrote:
In order to support more coalesce parameters through netlink, add two new parameter kernel_coal and extack for .set_coalesce and .get_coalesce, then some extra info can return to user with the netlink API.
Signed-off-by: Yufeng Mo moyufeng@huawei.com Signed-off-by: Huazhong Tan tanhuazhong@huawei.com
[...]
index 81fa36a..f2abc31 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -1619,12 +1619,14 @@ static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev, void __user *useraddr) { struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
struct kernel_ethtool_coalesce kernel_coalesce = {}; int ret;
if (!dev->ethtool_ops->get_coalesce) return -EOPNOTSUPP;
- ret = dev->ethtool_ops->get_coalesce(dev, &coalesce);
- ret = dev->ethtool_ops->get_coalesce(dev, &coalesce, &kernel_coalesce,
if (ret) return ret;NULL);
@@ -1691,19 +1693,26 @@ ethtool_set_coalesce_supported(struct net_device *dev, static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev, void __user *useraddr) {
- struct kernel_ethtool_coalesce kernel_coalesce = {}; struct ethtool_coalesce coalesce; int ret;
- if (!dev->ethtool_ops->set_coalesce)
- if (!dev->ethtool_ops->set_coalesce && !dev->ethtool_ops->get_coalesce) return -EOPNOTSUPP;
This needs to be
if (!set_coalesce || !get_coalesce) return -EOPNOTSUPP;
Otherwise you end up calling a NULL pointer below if just _one_ of the callbacks is available.
ret = dev->ethtool_ops->get_coalesce(dev, &coalesce, &kernel_coalesce,
NULL);
if (ret)
return ret;
if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) return -EFAULT;
if (!ethtool_set_coalesce_supported(dev, &coalesce)) return -EOPNOTSUPP;
- ret = dev->ethtool_ops->set_coalesce(dev, &coalesce);
- ret = dev->ethtool_ops->set_coalesce(dev, &coalesce, &kernel_coalesce,
if (!ret) ethtool_notify(dev, ETHTOOL_MSG_COALESCE_NTF, NULL); return ret;NULL);