Skip to content

Commit 7fb1073

Browse files
q2venkuba-moo
authored andcommitted
net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net().
(un)?register_netdevice_notifier_dev_net() hold RTNL before triggering the notifier for all netdev in the netns. Let's convert the RTNL to rtnl_net_lock(). Note that move_netdevice_notifiers_dev_net() is assumed to be (but not yet) protected by per-netns RTNL of both src and dst netns; we need to convert wireless and hyperv drivers that call dev_change_net_namespace(). Signed-off-by: Kuniyuki Iwashima <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent ca779f4 commit 7fb1073

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

net/core/dev.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1946,15 +1946,17 @@ int register_netdevice_notifier_dev_net(struct net_device *dev,
19461946
struct notifier_block *nb,
19471947
struct netdev_net_notifier *nn)
19481948
{
1949+
struct net *net = dev_net(dev);
19491950
int err;
19501951

1951-
rtnl_lock();
1952-
err = __register_netdevice_notifier_net(dev_net(dev), nb, false);
1952+
rtnl_net_lock(net);
1953+
err = __register_netdevice_notifier_net(net, nb, false);
19531954
if (!err) {
19541955
nn->nb = nb;
19551956
list_add(&nn->list, &dev->net_notifier_list);
19561957
}
1957-
rtnl_unlock();
1958+
rtnl_net_unlock(net);
1959+
19581960
return err;
19591961
}
19601962
EXPORT_SYMBOL(register_netdevice_notifier_dev_net);
@@ -1963,12 +1965,14 @@ int unregister_netdevice_notifier_dev_net(struct net_device *dev,
19631965
struct notifier_block *nb,
19641966
struct netdev_net_notifier *nn)
19651967
{
1968+
struct net *net = dev_net(dev);
19661969
int err;
19671970

1968-
rtnl_lock();
1971+
rtnl_net_lock(net);
19691972
list_del(&nn->list);
1970-
err = __unregister_netdevice_notifier_net(dev_net(dev), nb);
1971-
rtnl_unlock();
1973+
err = __unregister_netdevice_notifier_net(net, nb);
1974+
rtnl_net_unlock(net);
1975+
19721976
return err;
19731977
}
19741978
EXPORT_SYMBOL(unregister_netdevice_notifier_dev_net);

0 commit comments

Comments
 (0)