net: Introduce unregister_netdevice_queue()
Subsystems (2)
PATCH 1/6 net: Introduce unregister_netdevice_queue()
This patchs adds an unreg_list anchor to struct net_device, and introduces an unregister_netdevice_queue() function, able to queue a net_device to a list instead of immediately unregister it.
Signed-off-by Eric Dumazet <[email protected]>
--- include/linux/netdevice.h | 9 ++++++++- net/core/dev.c | 20 +++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-)
include/linux/netdevice.h +8 -1
@@ -683,6 +683,7 @@ struct net_devicestruct list_head dev_list;struct list_head napi_list; +struct list_head unreg_list;/* Net device features */ unsigned long features;
@@ -1116,7 +1117,13 @@ extern int dev_close(struct net_device *dev);extern void dev_disable_lro (struct net_device *dev);extern int dev_queue_xmit (struct sk_buff *skb);extern int register_netdevice (struct net_device *dev); -extern void unregister_netdevice (struct net_device *dev); +extern void unregister_netdevice_queue (struct net_device *dev, +struct list_head *head); +static inline void unregister_netdevice (struct net_device *dev) +{ +unregister_netdevice_queue (dev,NULL ); +} +extern void free_netdev (struct net_device *dev);extern void synchronize_net (void );extern int register_netdevice_notifier (struct notifier_block *nb);
net/core/dev.c +13 -7
@@ -5245,25 +5245,31 @@ void synchronize_net(void)EXPORT_SYMBOL (synchronize_net);/** -* unregister_netdevice - remove device from the kernel +* unregister_netdevice_queue - remove device from the kernel * @dev: device -* +* @head: list +* This function shuts down a device interface and removes it * from the kernel tables. +* If head not NULL, device is queued to be unregistered later. * * Callers must hold the rtnl semaphore. You may want * unregister_netdev() instead of this. */ -void unregister_netdevice (struct net_device *dev) +void unregister_netdevice_queue (struct net_device *dev,struct list_head *head) {ASSERT_RTNL (); -rollback_registered (dev); -/* Finish processing unregister after unlock */ -net_set_todo (dev); +if (head) { +list_add_tail (&dev->unreg_list, head); + }else { +rollback_registered (dev); +/* Finish processing unregister after unlock */ +net_set_todo (dev); + } } -EXPORT_SYMBOL (unregister_netdevice); +EXPORT_SYMBOL (unregister_netdevice_queue);/** * unregister_netdev - remove device from the kernel