From: Jay Vosburgh <fubar@us.ibm.com>
To: netdev@vger.kernel.org, rdreier@cisco.com, monis@voltaire.com
Cc: monisonlists@gmail.com, ogerlitz@voltaire.com, jgarzik@pobox.com,
davem@davemloft.net, general@lists.openfabrics.org,
Moni Shoua <monis@voltaire.com>
Subject: [PATCH 10/11] net/bonding: Destroy bonding master when last slave is gone
Date: Fri, 14 Sep 2007 16:40:29 -0700 [thread overview]
Message-ID: <11898132492312-git-send-email-fubar@us.ibm.com> (raw)
In-Reply-To: <11898132472055-git-send-email-fubar@us.ibm.com>
From: Moni Shoua <monis@voltaire.com>
When bonding enslaves non Ethernet devices it takes pointers to functions
in the module that owns the slaves. In this case it becomes unsafe
to keep the bonding master registered after last slave was unenslaved
because we don't know if the pointers are still valid. Destroying the bond when slave_cnt is zero
ensures that these functions be used anymore.
Signed-off-by: Moni Shoua <monis@voltaire.com>
Acked-by: Jay Vosburgh <fubar@us.ibm.com>
---
drivers/net/bonding/bond_main.c | 45 ++++++++++++++++++++++++++++++++++++++-
drivers/net/bonding/bonding.h | 3 ++
2 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index dfbfb00..77caca3 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1256,6 +1256,7 @@ static int bond_compute_features(struct bonding *bond)
static void bond_setup_by_slave(struct net_device *bond_dev,
struct net_device *slave_dev)
{
+ struct bonding *bond = bond_dev->priv;
bond_dev->hard_header = slave_dev->hard_header;
bond_dev->rebuild_header = slave_dev->rebuild_header;
bond_dev->hard_header_cache = slave_dev->hard_header_cache;
@@ -1270,6 +1271,7 @@ static void bond_setup_by_slave(struct net_device *bond_dev,
memcpy(bond_dev->broadcast, slave_dev->broadcast,
slave_dev->addr_len);
+ bond->setup_by_slave = 1;
}
/* enslave device <slave> to bond device <master> */
@@ -1838,6 +1840,35 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
}
/*
+* Destroy a bonding device.
+* Must be under rtnl_lock when this function is called.
+*/
+void bond_destroy(struct bonding *bond)
+{
+ bond_deinit(bond->dev);
+ bond_destroy_sysfs_entry(bond);
+ unregister_netdevice(bond->dev);
+}
+
+/*
+* First release a slave and than destroy the bond if no more slaves iare left.
+* Must be under rtnl_lock when this function is called.
+*/
+int bond_release_and_destroy(struct net_device *bond_dev, struct net_device *slave_dev)
+{
+ struct bonding *bond = bond_dev->priv;
+ int ret;
+
+ ret = bond_release(bond_dev, slave_dev);
+ if ((ret == 0) && (bond->slave_cnt == 0)) {
+ printk(KERN_INFO DRV_NAME " %s: destroying bond for.\n",
+ bond_dev->name);
+ bond_destroy(bond);
+ }
+ return ret;
+}
+
+/*
* This function releases all slaves.
*/
static int bond_release_all(struct net_device *bond_dev)
@@ -3322,7 +3353,11 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave
switch (event) {
case NETDEV_UNREGISTER:
if (bond_dev) {
- bond_release(bond_dev, slave_dev);
+ dprintk("slave %s unregisters\n", slave_dev->name);
+ if (bond->setup_by_slave)
+ bond_release_and_destroy(bond_dev, slave_dev);
+ else
+ bond_release(bond_dev, slave_dev);
}
break;
case NETDEV_CHANGE:
@@ -3331,6 +3366,13 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave
* sets up a hierarchical bond, then rmmod's
* one of the slave bonding devices?
*/
+ if (slave_dev->priv_flags & IFF_SLAVE_DETACH) {
+ dprintk("slave %s detaching\n", slave_dev->name);
+ if (bond->setup_by_slave)
+ bond_release_and_destroy(bond_dev, slave_dev);
+ else
+ bond_release(bond_dev, slave_dev);
+ }
break;
case NETDEV_DOWN:
/*
@@ -4311,6 +4353,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
bond->primary_slave = NULL;
bond->dev = bond_dev;
bond->send_grat_arp = 0;
+ bond->setup_by_slave = 0;
INIT_LIST_HEAD(&bond->vlan_list);
/* Initialize the device entry points */
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index b1cdb1f..ed0f587 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -188,6 +188,7 @@ struct bonding {
s8 kill_timers;
s8 do_set_mac_addr;
s8 send_grat_arp;
+ s8 setup_by_slave;
struct net_device_stats stats;
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *proc_entry;
@@ -295,6 +296,8 @@ static inline void bond_unset_master_alb_flags(struct bonding *bond)
struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr);
int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev);
int bond_create(char *name, struct bond_params *params, struct bonding **newbond);
+void bond_destroy(struct bonding *bond);
+int bond_release_and_destroy(struct net_device *bond_dev, struct net_device *slave_dev);
void bond_deinit(struct net_device *bond_dev);
int bond_create_sysfs(void);
void bond_destroy_sysfs(void);
--
1.5.2-rc2.GIT
next prev parent reply other threads:[~2007-09-14 23:40 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-14 23:40 [ofa-general] [PATCH 00/11] IPoIB support for bonding Jay Vosburgh
2007-09-14 23:40 ` [PATCH 01/11] IB/ipoib: Export call to call_netdevice_notifiers and add new private flag Jay Vosburgh
2007-09-14 23:40 ` [ofa-general] [PATCH 02/11] IB/ipoib: Notify the world before doing unregister Jay Vosburgh
2007-09-14 23:40 ` [PATCH 03/11] IB/ipoib: Bound the net device to the ipoib_neigh structue Jay Vosburgh
2007-09-14 23:40 ` [PATCH 04/11] IB/ipoib: Verify address handle validity on send Jay Vosburgh
2007-09-14 23:40 ` [PATCH 05/11] net/bonding: Enable bonding to enslave non ARPHRD_ETHER Jay Vosburgh
2007-09-14 23:40 ` [PATCH 06/11] net/bonding: Enable bonding to enslave netdevices not supporting set_mac_address() Jay Vosburgh
2007-09-14 23:40 ` [PATCH 07/11] net/bonding: Enable IP multicast for bonding IPoIB devices Jay Vosburgh
2007-09-14 23:40 ` [PATCH 08/11] net/bonding: Handle wrong assumptions that slave is always an Ethernet device Jay Vosburgh
2007-09-14 23:40 ` [PATCH 9/11] net/bonding: Delay sending of gratuitous ARP to avoid failure Jay Vosburgh
2007-09-14 23:40 ` Jay Vosburgh [this message]
2007-09-14 23:40 ` [PATCH 11/11] bonding: Optionally allow ethernet slaves to keep own MAC Jay Vosburgh
2007-09-17 22:20 ` [PATCH 04/11] IB/ipoib: Verify address handle validity on send Roland Dreier
2007-09-17 22:23 ` [ofa-general] Re: [PATCH 03/11] IB/ipoib: Bound the net device to the ipoib_neigh structue Roland Dreier
2007-09-17 22:22 ` [ofa-general] Re: [PATCH 02/11] IB/ipoib: Notify the world before doing unregister Roland Dreier
2007-09-17 22:25 ` Roland Dreier
2007-09-17 23:23 ` Jay Vosburgh
2007-09-17 23:33 ` Roland Dreier
2007-09-18 17:42 ` [ofa-general] " Roland Dreier
2007-09-19 16:41 ` Moni Shoua
2007-09-19 16:44 ` Roland Dreier
2007-09-17 22:17 ` [ofa-general] Re: [PATCH 01/11] IB/ipoib: Export call to call_netdevice_notifiers and add new private flag Roland Dreier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11898132492312-git-send-email-fubar@us.ibm.com \
--to=fubar@us.ibm.com \
--cc=davem@davemloft.net \
--cc=general@lists.openfabrics.org \
--cc=jgarzik@pobox.com \
--cc=monis@voltaire.com \
--cc=monisonlists@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=ogerlitz@voltaire.com \
--cc=rdreier@cisco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).