Skip to content

Commit 064ca25

Browse files
Florian WestphalNipaLocal
authored andcommitted
net: core: move unregister_many inner loops to a helper
Will be re-used in a followup patch, no functional change intended. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: NipaLocal <nipa@local>
1 parent 8bfe553 commit 064ca25

File tree

1 file changed

+33
-24
lines changed

1 file changed

+33
-24
lines changed

net/core/dev.c

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1217912211
void 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

Comments
 (0)