net: get rid of rtnl_lock_unregistering()
authorEric Dumazet <edumazet@google.com>
Fri, 18 Feb 2022 17:58:56 +0000 (09:58 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 Feb 2022 16:24:03 +0000 (16:24 +0000)
After recent patches, and in particular commits
 faab39f63c1f ("net: allow out-of-order netdev unregistration") and
 e5f80fcf869a ("ipv6: give an IPv6 dev to blackhole_netdev")
we no longer need the barrier implemented in rtnl_lock_unregistering().

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index acd8849..a119029 100644 (file)
@@ -10884,36 +10884,6 @@ static void __net_exit default_device_exit_net(struct net *net)
        }
 }
 
-static void __net_exit rtnl_lock_unregistering(struct list_head *net_list)
-{
-       /* Return (with the rtnl_lock held) when there are no network
-        * devices unregistering in any network namespace in net_list.
-        */
-       DEFINE_WAIT_FUNC(wait, woken_wake_function);
-       bool unregistering;
-       struct net *net;
-
-       ASSERT_RTNL();
-       add_wait_queue(&netdev_unregistering_wq, &wait);
-       for (;;) {
-               unregistering = false;
-
-               list_for_each_entry(net, net_list, exit_list) {
-                       if (atomic_read(&net->dev_unreg_count) > 0) {
-                               unregistering = true;
-                               break;
-                       }
-               }
-               if (!unregistering)
-                       break;
-               __rtnl_unlock();
-
-               wait_woken(&wait, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
-               rtnl_lock();
-       }
-       remove_wait_queue(&netdev_unregistering_wq, &wait);
-}
-
 static void __net_exit default_device_exit_batch(struct list_head *net_list)
 {
        /* At exit all network devices most be removed from a network
@@ -10930,18 +10900,6 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list)
                default_device_exit_net(net);
                cond_resched();
        }
-       /* To prevent network device cleanup code from dereferencing
-        * loopback devices or network devices that have been freed
-        * wait here for all pending unregistrations to complete,
-        * before unregistring the loopback device and allowing the
-        * network namespace be freed.
-        *
-        * The netdev todo list containing all network devices
-        * unregistrations that happen in default_device_exit_batch
-        * will run in the rtnl_unlock() at the end of
-        * default_device_exit_batch.
-        */
-       rtnl_lock_unregistering(net_list);
 
        list_for_each_entry(net, net_list, exit_list) {
                for_each_netdev_reverse(net, dev) {