ethtool: extend coalesce setting uAPI with CQE mode
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> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
029ee6b143
commit
f3ccfda193
@@ -62,6 +62,7 @@ static int coalesce_prepare_data(const struct ethnl_req_info *req_base,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct coalesce_reply_data *data = COALESCE_REPDATA(reply_base);
|
||||
struct netlink_ext_ack *extack = info ? info->extack : NULL;
|
||||
struct net_device *dev = reply_base->dev;
|
||||
int ret;
|
||||
|
||||
@@ -71,7 +72,8 @@ static int coalesce_prepare_data(const struct ethnl_req_info *req_base,
|
||||
ret = ethnl_ops_begin(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = dev->ethtool_ops->get_coalesce(dev, &data->coalesce);
|
||||
ret = dev->ethtool_ops->get_coalesce(dev, &data->coalesce,
|
||||
&data->kernel_coalesce, extack);
|
||||
ethnl_ops_complete(dev);
|
||||
|
||||
return ret;
|
||||
@@ -266,7 +268,8 @@ int ethnl_set_coalesce(struct sk_buff *skb, struct genl_info *info)
|
||||
ret = ethnl_ops_begin(dev);
|
||||
if (ret < 0)
|
||||
goto out_rtnl;
|
||||
ret = ops->get_coalesce(dev, &coalesce);
|
||||
ret = ops->get_coalesce(dev, &coalesce, &kernel_coalesce,
|
||||
info->extack);
|
||||
if (ret < 0)
|
||||
goto out_ops;
|
||||
|
||||
@@ -322,7 +325,8 @@ int ethnl_set_coalesce(struct sk_buff *skb, struct genl_info *info)
|
||||
if (!mod)
|
||||
goto out_ops;
|
||||
|
||||
ret = dev->ethtool_ops->set_coalesce(dev, &coalesce);
|
||||
ret = dev->ethtool_ops->set_coalesce(dev, &coalesce, &kernel_coalesce,
|
||||
info->extack);
|
||||
if (ret < 0)
|
||||
goto out_ops;
|
||||
ethtool_notify(dev, ETHTOOL_MSG_COALESCE_NTF, NULL);
|
||||
|
||||
@@ -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,
|
||||
NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -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;
|
||||
|
||||
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,
|
||||
NULL);
|
||||
if (!ret)
|
||||
ethtool_notify(dev, ETHTOOL_MSG_COALESCE_NTF, NULL);
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user