ethtool: do not use rtnl in ethnl_default_dumpit()
authorEric Dumazet <edumazet@google.com>
Wed, 7 Feb 2024 15:35:14 +0000 (15:35 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 Feb 2024 03:08:51 +0000 (19:08 -0800)
for_each_netdev_dump() can be used with RCU protection,
no need for rtnl if we are going to use dev_hold()/dev_put().

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20240207153514.3640952-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ethtool/netlink.c

index fe3553f60bf39e64602d932505a0851e692348a0..bd04f28d5cf4bbe368e0eb64717a4f7438e66924 100644 (file)
@@ -477,11 +477,7 @@ out:
        return ret;
 }
 
-/* Default ->dumpit() handler for GET requests. Device iteration copied from
- * rtnl_dump_ifinfo(); we have to be more careful about device hashtable
- * persistence as we cannot guarantee to hold RTNL lock through the whole
- * function as rtnetnlink does.
- */
+/* Default ->dumpit() handler for GET requests. */
 static int ethnl_default_dumpit(struct sk_buff *skb,
                                struct netlink_callback *cb)
 {
@@ -490,14 +486,14 @@ static int ethnl_default_dumpit(struct sk_buff *skb,
        struct net_device *dev;
        int ret = 0;
 
-       rtnl_lock();
+       rcu_read_lock();
        for_each_netdev_dump(net, dev, ctx->pos_ifindex) {
                dev_hold(dev);
-               rtnl_unlock();
+               rcu_read_unlock();
 
                ret = ethnl_default_dump_one(skb, dev, ctx, genl_info_dump(cb));
 
-               rtnl_lock();
+               rcu_read_lock();
                dev_put(dev);
 
                if (ret < 0 && ret != -EOPNOTSUPP) {
@@ -507,7 +503,7 @@ static int ethnl_default_dumpit(struct sk_buff *skb,
                }
                ret = 0;
        }
-       rtnl_unlock();
+       rcu_read_unlock();
 
        return ret;
 }