OSDN Git Service

net: move rollback_registered_many()
authorJakub Kicinski <kuba@kernel.org>
Tue, 19 Jan 2021 20:25:20 +0000 (12:25 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 21 Jan 2021 05:04:19 +0000 (21:04 -0800)
Move rollback_registered_many() and add a temporary
forward declaration to make merging the code into
unregister_netdevice_many() easier to review.

No functional changes.

Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/dev.c

index 9a14714..1fb99ae 100644 (file)
@@ -9459,99 +9459,6 @@ static void net_set_todo(struct net_device *dev)
        dev_net(dev)->dev_unreg_count++;
 }
 
-static void rollback_registered_many(struct list_head *head)
-{
-       struct net_device *dev, *tmp;
-       LIST_HEAD(close_head);
-
-       BUG_ON(dev_boot_phase);
-       ASSERT_RTNL();
-
-       list_for_each_entry_safe(dev, tmp, head, unreg_list) {
-               /* Some devices call without registering
-                * for initialization unwind. Remove those
-                * devices and proceed with the remaining.
-                */
-               if (dev->reg_state == NETREG_UNINITIALIZED) {
-                       pr_debug("unregister_netdevice: device %s/%p never was registered\n",
-                                dev->name, dev);
-
-                       WARN_ON(1);
-                       list_del(&dev->unreg_list);
-                       continue;
-               }
-               dev->dismantle = true;
-               BUG_ON(dev->reg_state != NETREG_REGISTERED);
-       }
-
-       /* If device is running, close it first. */
-       list_for_each_entry(dev, head, unreg_list)
-               list_add_tail(&dev->close_list, &close_head);
-       dev_close_many(&close_head, true);
-
-       list_for_each_entry(dev, head, unreg_list) {
-               /* And unlink it from device chain. */
-               unlist_netdevice(dev);
-
-               dev->reg_state = NETREG_UNREGISTERING;
-       }
-       flush_all_backlogs();
-
-       synchronize_net();
-
-       list_for_each_entry(dev, head, unreg_list) {
-               struct sk_buff *skb = NULL;
-
-               /* Shutdown queueing discipline. */
-               dev_shutdown(dev);
-
-               dev_xdp_uninstall(dev);
-
-               /* Notify protocols, that we are about to destroy
-                * this device. They should clean all the things.
-                */
-               call_netdevice_notifiers(NETDEV_UNREGISTER, dev);
-
-               if (!dev->rtnl_link_ops ||
-                   dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
-                       skb = rtmsg_ifinfo_build_skb(RTM_DELLINK, dev, ~0U, 0,
-                                                    GFP_KERNEL, NULL, 0);
-
-               /*
-                *      Flush the unicast and multicast chains
-                */
-               dev_uc_flush(dev);
-               dev_mc_flush(dev);
-
-               netdev_name_node_alt_flush(dev);
-               netdev_name_node_free(dev->name_node);
-
-               if (dev->netdev_ops->ndo_uninit)
-                       dev->netdev_ops->ndo_uninit(dev);
-
-               if (skb)
-                       rtmsg_ifinfo_send(skb, dev, GFP_KERNEL);
-
-               /* Notifier chain MUST detach us all upper devices. */
-               WARN_ON(netdev_has_any_upper_dev(dev));
-               WARN_ON(netdev_has_any_lower_dev(dev));
-
-               /* Remove entries from kobject tree */
-               netdev_unregister_kobject(dev);
-#ifdef CONFIG_XPS
-               /* Remove XPS queueing entries */
-               netif_reset_xps_queues_gt(dev, 0);
-#endif
-       }
-
-       synchronize_net();
-
-       list_for_each_entry(dev, head, unreg_list) {
-               dev_put(dev);
-               net_set_todo(dev);
-       }
-}
-
 static netdev_features_t netdev_sync_upper_features(struct net_device *lower,
        struct net_device *upper, netdev_features_t features)
 {
@@ -10703,6 +10610,8 @@ void synchronize_net(void)
 }
 EXPORT_SYMBOL(synchronize_net);
 
+static void rollback_registered_many(struct list_head *head);
+
 /**
  *     unregister_netdevice_queue - remove device from the kernel
  *     @dev: device
@@ -10748,6 +10657,99 @@ void unregister_netdevice_many(struct list_head *head)
 }
 EXPORT_SYMBOL(unregister_netdevice_many);
 
+static void rollback_registered_many(struct list_head *head)
+{
+       struct net_device *dev, *tmp;
+       LIST_HEAD(close_head);
+
+       BUG_ON(dev_boot_phase);
+       ASSERT_RTNL();
+
+       list_for_each_entry_safe(dev, tmp, head, unreg_list) {
+               /* Some devices call without registering
+                * for initialization unwind. Remove those
+                * devices and proceed with the remaining.
+                */
+               if (dev->reg_state == NETREG_UNINITIALIZED) {
+                       pr_debug("unregister_netdevice: device %s/%p never was registered\n",
+                                dev->name, dev);
+
+                       WARN_ON(1);
+                       list_del(&dev->unreg_list);
+                       continue;
+               }
+               dev->dismantle = true;
+               BUG_ON(dev->reg_state != NETREG_REGISTERED);
+       }
+
+       /* If device is running, close it first. */
+       list_for_each_entry(dev, head, unreg_list)
+               list_add_tail(&dev->close_list, &close_head);
+       dev_close_many(&close_head, true);
+
+       list_for_each_entry(dev, head, unreg_list) {
+               /* And unlink it from device chain. */
+               unlist_netdevice(dev);
+
+               dev->reg_state = NETREG_UNREGISTERING;
+       }
+       flush_all_backlogs();
+
+       synchronize_net();
+
+       list_for_each_entry(dev, head, unreg_list) {
+               struct sk_buff *skb = NULL;
+
+               /* Shutdown queueing discipline. */
+               dev_shutdown(dev);
+
+               dev_xdp_uninstall(dev);
+
+               /* Notify protocols, that we are about to destroy
+                * this device. They should clean all the things.
+                */
+               call_netdevice_notifiers(NETDEV_UNREGISTER, dev);
+
+               if (!dev->rtnl_link_ops ||
+                   dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
+                       skb = rtmsg_ifinfo_build_skb(RTM_DELLINK, dev, ~0U, 0,
+                                                    GFP_KERNEL, NULL, 0);
+
+               /*
+                *      Flush the unicast and multicast chains
+                */
+               dev_uc_flush(dev);
+               dev_mc_flush(dev);
+
+               netdev_name_node_alt_flush(dev);
+               netdev_name_node_free(dev->name_node);
+
+               if (dev->netdev_ops->ndo_uninit)
+                       dev->netdev_ops->ndo_uninit(dev);
+
+               if (skb)
+                       rtmsg_ifinfo_send(skb, dev, GFP_KERNEL);
+
+               /* Notifier chain MUST detach us all upper devices. */
+               WARN_ON(netdev_has_any_upper_dev(dev));
+               WARN_ON(netdev_has_any_lower_dev(dev));
+
+               /* Remove entries from kobject tree */
+               netdev_unregister_kobject(dev);
+#ifdef CONFIG_XPS
+               /* Remove XPS queueing entries */
+               netif_reset_xps_queues_gt(dev, 0);
+#endif
+       }
+
+       synchronize_net();
+
+       list_for_each_entry(dev, head, unreg_list) {
+               dev_put(dev);
+               net_set_todo(dev);
+       }
+}
+
 /**
  *     unregister_netdev - remove device from the kernel
  *     @dev: device