net: ethtool: move checks before rtnl_lock() in ethnl_set_rings
authorJie Wang <wangjie125@huawei.com>
Tue, 12 Apr 2022 02:01:20 +0000 (10:01 +0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 15 Apr 2022 18:41:45 +0000 (11:41 -0700)
Currently these two checks in ethnl_set_rings are added after rtnl_lock()
which will do useless works if the request is invalid.

So this patch moves these checks before the rtnl_lock() to avoid these
costs.

Signed-off-by: Jie Wang <wangjie125@huawei.com>
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ethtool/rings.c

index 9ed60c507d97d673bcaec18d123c56bce6ec1997..fa3ec8d438f7df3e40fbfafbebe7011c5104edc0 100644 (file)
@@ -152,6 +152,24 @@ int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info)
        if (!ops->get_ringparam || !ops->set_ringparam)
                goto out_dev;
 
+       if (tb[ETHTOOL_A_RINGS_RX_BUF_LEN] &&
+           !(ops->supported_ring_params & ETHTOOL_RING_USE_RX_BUF_LEN)) {
+               ret = -EOPNOTSUPP;
+               NL_SET_ERR_MSG_ATTR(info->extack,
+                                   tb[ETHTOOL_A_RINGS_RX_BUF_LEN],
+                                   "setting rx buf len not supported");
+               goto out_dev;
+       }
+
+       if (tb[ETHTOOL_A_RINGS_CQE_SIZE] &&
+           !(ops->supported_ring_params & ETHTOOL_RING_USE_CQE_SIZE)) {
+               ret = -EOPNOTSUPP;
+               NL_SET_ERR_MSG_ATTR(info->extack,
+                                   tb[ETHTOOL_A_RINGS_CQE_SIZE],
+                                   "setting cqe size not supported");
+               goto out_dev;
+       }
+
        if (tb[ETHTOOL_A_RINGS_TX_PUSH] &&
            !(ops->supported_ring_params & ETHTOOL_RING_USE_TX_PUSH)) {
                ret = -EOPNOTSUPP;
@@ -201,24 +219,6 @@ int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info)
                goto out_ops;
        }
 
-       if (kernel_ringparam.rx_buf_len != 0 &&
-           !(ops->supported_ring_params & ETHTOOL_RING_USE_RX_BUF_LEN)) {
-               ret = -EOPNOTSUPP;
-               NL_SET_ERR_MSG_ATTR(info->extack,
-                                   tb[ETHTOOL_A_RINGS_RX_BUF_LEN],
-                                   "setting rx buf len not supported");
-               goto out_ops;
-       }
-
-       if (kernel_ringparam.cqe_size &&
-           !(ops->supported_ring_params & ETHTOOL_RING_USE_CQE_SIZE)) {
-               ret = -EOPNOTSUPP;
-               NL_SET_ERR_MSG_ATTR(info->extack,
-                                   tb[ETHTOOL_A_RINGS_CQE_SIZE],
-                                   "setting cqe size not supported");
-               goto out_ops;
-       }
-
        ret = dev->ethtool_ops->set_ringparam(dev, &ringparam,
                                              &kernel_ringparam, info->extack);
        if (ret < 0)