mirror of
https://github.com/torvalds/linux
synced 2024-09-06 09:51:23 +00:00
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: 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>
This commit is contained in:
parent
fd0bb2c7cc
commit
e7689879d1
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue