diff options
author | Kuniyuki Iwashima <kuniyu@amazon.com> | 2025-01-04 11:21:49 +0300 |
---|---|---|
committer | Paolo Abeni <pabeni@redhat.com> | 2025-01-07 15:45:53 +0300 |
commit | 00fb9823939ea39b553985b1b3f5377dc2386d63 (patch) | |
tree | 635389a27d18e33a6d36188c7280eb353370658c | |
parent | 7bd72a4aa226c3ef752bcd6b33c54f6e85efcc60 (diff) | |
download | linux-00fb9823939ea39b553985b1b3f5377dc2386d63.tar.xz |
dev: Hold per-netns RTNL in (un)?register_netdev().
Let's hold per-netns RTNL of dev_net(dev) in register_netdev()
and unregister_netdev().
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-rw-r--r-- | net/core/dev.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index e7223972b9aa..073f682a9653 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -10731,12 +10731,16 @@ EXPORT_SYMBOL_GPL(init_dummy_netdev); */ int register_netdev(struct net_device *dev) { + struct net *net = dev_net(dev); int err; - if (rtnl_lock_killable()) + if (rtnl_net_lock_killable(net)) return -EINTR; + err = register_netdevice(dev); - rtnl_unlock(); + + rtnl_net_unlock(net); + return err; } EXPORT_SYMBOL(register_netdev); @@ -11606,9 +11610,11 @@ EXPORT_SYMBOL(unregister_netdevice_many); */ void unregister_netdev(struct net_device *dev) { - rtnl_lock(); + struct net *net = dev_net(dev); + + rtnl_net_lock(net); unregister_netdevice(dev); - rtnl_unlock(); + rtnl_net_unlock(net); } EXPORT_SYMBOL(unregister_netdev); |