[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <535CA0BB.1010504@cumulusnetworks.com>
Date: Sat, 26 Apr 2014 23:16:27 -0700
From: Roopa Prabhu <roopa@...ulusnetworks.com>
To: netdev <netdev@...r.kernel.org>
CC: Jiri Pirko <jiri@...nulli.us>, Thomas Graf <tgraf@...g.ch>,
David Miller <davem@...emloft.net>
Subject: Question regarding bond delete notifications
Hello,
I am seeing a problem with the order of rtnl link notifications during
bond deletes.
If i delete a bond without deleting its slaves, kernel sends a
RTM_DELLINK during unregister_netdevice
(in rollback_registered_many) and then calls bond_uninit (ndo_uninit).
bond_uninit inturn cleans up the slaves and generates a few RTM_NEWLINK
rtnl notifications for NETDEV_CHANGEADDR and NETDEV_FEAT_CHANGE for the
bond device.
This is confusing to userspace listening for rtnl LINK Notifications.
For example, libnl gets confused with RTM_NEWLINK arriving after
RTM_DELLINK.
The RTM_NEWLINK makes libnl believe that this is a new bond link. But
kernel has already deleted the bond device.
It seems like the kernel should generate RTM_DELLINK notification after
ndo_uninit. something like below.
But am not sure if this change is safe for other netdevices.
Is this a known problem ?. Any suggestions ?
Thanks,
Roopa
diff --git a/net/core/dev.c b/net/core/dev.c
index b1b0c8d..85cb73a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5568,33 +5568,33 @@ static void rollback_registered_many(struct
list_head *head)
list_for_each_entry(dev, head, unreg_list) {
/* Shutdown queueing discipline. */
dev_shutdown(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)
- rtmsg_ifinfo(RTM_DELLINK, dev, ~0U, GFP_KERNEL);
-
/*
* Flush the unicast and multicast chains
*/
dev_uc_flush(dev);
dev_mc_flush(dev);
if (dev->netdev_ops->ndo_uninit)
dev->netdev_ops->ndo_uninit(dev);
+ if (!dev->rtnl_link_ops ||
+ dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
+ rtmsg_ifinfo(RTM_DELLINK, dev, ~0U, GFP_KERNEL);
+
/* Notifier chain MUST detach us all upper devices. */
WARN_ON(netdev_has_any_upper_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
}
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists