@@ -12176,11 +12176,42 @@ static void dev_memory_provider_uninstall(struct net_device *dev)
1217612176 }
1217712177}
1217812178
12179+ static void unregister_netdevice_close_many (struct list_head * head )
12180+ {
12181+ struct net_device * dev ;
12182+ LIST_HEAD (close_head );
12183+
12184+ /* If device is running, close it first. Start with ops locked... */
12185+ list_for_each_entry (dev , head , unreg_list ) {
12186+ if (netdev_need_ops_lock (dev )) {
12187+ list_add_tail (& dev -> close_list , & close_head );
12188+ netdev_lock (dev );
12189+ }
12190+ }
12191+ netif_close_many (& close_head , true);
12192+ /* ... now unlock them and go over the rest. */
12193+
12194+ list_for_each_entry (dev , head , unreg_list ) {
12195+ if (netdev_need_ops_lock (dev ))
12196+ netdev_unlock (dev );
12197+ else
12198+ list_add_tail (& dev -> close_list , & close_head );
12199+ }
12200+ netif_close_many (& close_head , true);
12201+
12202+ list_for_each_entry (dev , head , unreg_list ) {
12203+ /* And unlink it from device chain. */
12204+ unlist_netdevice (dev );
12205+ netdev_lock (dev );
12206+ WRITE_ONCE (dev -> reg_state , NETREG_UNREGISTERING );
12207+ netdev_unlock (dev );
12208+ }
12209+ }
12210+
1217912211void unregister_netdevice_many_notify (struct list_head * head ,
1218012212 u32 portid , const struct nlmsghdr * nlh )
1218112213{
1218212214 struct net_device * dev , * tmp ;
12183- LIST_HEAD (close_head );
1218412215 int cnt = 0 ;
1218512216
1218612217 BUG_ON (dev_boot_phase );
@@ -12206,30 +12237,8 @@ void unregister_netdevice_many_notify(struct list_head *head,
1220612237 BUG_ON (dev -> reg_state != NETREG_REGISTERED );
1220712238 }
1220812239
12209- /* If device is running, close it first. Start with ops locked... */
12210- list_for_each_entry (dev , head , unreg_list ) {
12211- if (netdev_need_ops_lock (dev )) {
12212- list_add_tail (& dev -> close_list , & close_head );
12213- netdev_lock (dev );
12214- }
12215- }
12216- netif_close_many (& close_head , true);
12217- /* ... now unlock them and go over the rest. */
12218- list_for_each_entry (dev , head , unreg_list ) {
12219- if (netdev_need_ops_lock (dev ))
12220- netdev_unlock (dev );
12221- else
12222- list_add_tail (& dev -> close_list , & close_head );
12223- }
12224- netif_close_many (& close_head , true);
12240+ unregister_netdevice_close_many (head );
1222512241
12226- list_for_each_entry (dev , head , unreg_list ) {
12227- /* And unlink it from device chain. */
12228- unlist_netdevice (dev );
12229- netdev_lock (dev );
12230- WRITE_ONCE (dev -> reg_state , NETREG_UNREGISTERING );
12231- netdev_unlock (dev );
12232- }
1223312242 flush_all_backlogs ();
1223412243
1223512244 synchronize_net ();
0 commit comments