Skip to content

Commit d02e3b3

Browse files
committed
netdev: don't hold rtnl_lock over nl queue info get when possible
Netdev queue dump accesses: NAPI, memory providers, XSk pointers. All three are "ops protected" now, switch to the op compat locking. rtnl lock does not have to be taken for "ops locked" devices. Reviewed-by: Joe Damato <[email protected]> Acked-by: Stanislav Fomichev <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 4ec9031 commit d02e3b3

File tree

1 file changed

+7
-11
lines changed

1 file changed

+7
-11
lines changed

net/core/netdev-genl.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -481,18 +481,15 @@ int netdev_nl_queue_get_doit(struct sk_buff *skb, struct genl_info *info)
481481
if (!rsp)
482482
return -ENOMEM;
483483

484-
rtnl_lock();
485-
486-
netdev = netdev_get_by_index_lock(genl_info_net(info), ifindex);
484+
netdev = netdev_get_by_index_lock_ops_compat(genl_info_net(info),
485+
ifindex);
487486
if (netdev) {
488487
err = netdev_nl_queue_fill(rsp, netdev, q_id, q_type, info);
489-
netdev_unlock(netdev);
488+
netdev_unlock_ops_compat(netdev);
490489
} else {
491490
err = -ENODEV;
492491
}
493492

494-
rtnl_unlock();
495-
496493
if (err)
497494
goto err_free_msg;
498495

@@ -541,25 +538,24 @@ int netdev_nl_queue_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
541538
if (info->attrs[NETDEV_A_QUEUE_IFINDEX])
542539
ifindex = nla_get_u32(info->attrs[NETDEV_A_QUEUE_IFINDEX]);
543540

544-
rtnl_lock();
545541
if (ifindex) {
546-
netdev = netdev_get_by_index_lock(net, ifindex);
542+
netdev = netdev_get_by_index_lock_ops_compat(net, ifindex);
547543
if (netdev) {
548544
err = netdev_nl_queue_dump_one(netdev, skb, info, ctx);
549-
netdev_unlock(netdev);
545+
netdev_unlock_ops_compat(netdev);
550546
} else {
551547
err = -ENODEV;
552548
}
553549
} else {
554-
for_each_netdev_lock_scoped(net, netdev, ctx->ifindex) {
550+
for_each_netdev_lock_ops_compat_scoped(net, netdev,
551+
ctx->ifindex) {
555552
err = netdev_nl_queue_dump_one(netdev, skb, info, ctx);
556553
if (err < 0)
557554
break;
558555
ctx->rxq_idx = 0;
559556
ctx->txq_idx = 0;
560557
}
561558
}
562-
rtnl_unlock();
563559

564560
return err;
565561
}

0 commit comments

Comments
 (0)