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

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.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent fd0bb2c7
...@@ -477,11 +477,7 @@ static int ethnl_default_dump_one(struct sk_buff *skb, struct net_device *dev, ...@@ -477,11 +477,7 @@ static int ethnl_default_dump_one(struct sk_buff *skb, struct net_device *dev,
return ret; return ret;
} }
/* Default ->dumpit() handler for GET requests. Device iteration copied from /* Default ->dumpit() handler for GET requests. */
* 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.
*/
static int ethnl_default_dumpit(struct sk_buff *skb, static int ethnl_default_dumpit(struct sk_buff *skb,
struct netlink_callback *cb) struct netlink_callback *cb)
{ {
...@@ -490,14 +486,14 @@ static int ethnl_default_dumpit(struct sk_buff *skb, ...@@ -490,14 +486,14 @@ static int ethnl_default_dumpit(struct sk_buff *skb,
struct net_device *dev; struct net_device *dev;
int ret = 0; int ret = 0;
rtnl_lock(); rcu_read_lock();
for_each_netdev_dump(net, dev, ctx->pos_ifindex) { for_each_netdev_dump(net, dev, ctx->pos_ifindex) {
dev_hold(dev); dev_hold(dev);
rtnl_unlock(); rcu_read_unlock();
ret = ethnl_default_dump_one(skb, dev, ctx, genl_info_dump(cb)); ret = ethnl_default_dump_one(skb, dev, ctx, genl_info_dump(cb));
rtnl_lock(); rcu_read_lock();
dev_put(dev); dev_put(dev);
if (ret < 0 && ret != -EOPNOTSUPP) { if (ret < 0 && ret != -EOPNOTSUPP) {
...@@ -507,7 +503,7 @@ static int ethnl_default_dumpit(struct sk_buff *skb, ...@@ -507,7 +503,7 @@ static int ethnl_default_dumpit(struct sk_buff *skb,
} }
ret = 0; ret = 0;
} }
rtnl_unlock(); rcu_read_unlock();
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment