Commit e7689879 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski
Browse files

ethtool: do not use rtnl in ethnl_default_dumpit()



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: default avatarEric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20240207153514.3640952-1-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent fd0bb2c7
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -477,11 +477,7 @@ static int ethnl_default_dump_one(struct sk_buff *skb, struct net_device *dev,
	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;
}