.exit = netdev_exit,
 };
 
-static void __net_exit default_device_exit(struct net *net)
+static void __net_exit default_device_exit_net(struct net *net)
 {
        struct net_device *dev, *aux;
        /*
         * Push all migratable network devices back to the
         * initial network namespace
         */
-       rtnl_lock();
+       ASSERT_RTNL();
        for_each_netdev_safe(net, dev, aux) {
                int err;
                char fb_name[IFNAMSIZ];
                        BUG();
                }
        }
-       rtnl_unlock();
 }
 
 static void __net_exit rtnl_lock_unregistering(struct list_head *net_list)
 {
-       /* Return with the rtnl_lock held when there are no network
+       /* Return (with the rtnl_lock held) when there are no network
         * devices unregistering in any network namespace in net_list.
         */
-       struct net *net;
-       bool unregistering;
        DEFINE_WAIT_FUNC(wait, woken_wake_function);
+       bool unregistering;
+       struct net *net;
 
+       ASSERT_RTNL();
        add_wait_queue(&netdev_unregistering_wq, &wait);
        for (;;) {
                unregistering = false;
-               rtnl_lock();
+
                list_for_each_entry(net, net_list, exit_list) {
                        if (net->dev_unreg_count > 0) {
                                unregistering = true;
                __rtnl_unlock();
 
                wait_woken(&wait, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
+               rtnl_lock();
        }
        remove_wait_queue(&netdev_unregistering_wq, &wait);
 }
        struct net *net;
        LIST_HEAD(dev_kill_list);
 
+       rtnl_lock();
+       list_for_each_entry(net, net_list, exit_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,
         * default_device_exit_batch.
         */
        rtnl_lock_unregistering(net_list);
+
        list_for_each_entry(net, net_list, exit_list) {
                for_each_netdev_reverse(net, dev) {
                        if (dev->rtnl_link_ops && dev->rtnl_link_ops->dellink)
 }
 
 static struct pernet_operations __net_initdata default_device_ops = {
-       .exit = default_device_exit,
        .exit_batch = default_device_exit_batch,
 };