Message ID | 13dbe805d13bba461e50483c0162ce8bc1366204.1313403625.git.panweiping3@gmail.com |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On Mon, 15 Aug 2011 18:25:16 +0800, Weiping Pan wrote: > > diff --git a/drivers/net/bonding/bond_main.c > b/drivers/net/bonding/bond_main.c index 38a83ac..3ed9827 100644 > --- a/drivers/net/bonding/bond_main.c > +++ b/drivers/net/bonding/bond_main.c > @@ -3419,9 +3419,27 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, int count) > static int bond_open(struct net_device *bond_dev) { > struct bonding *bond = netdev_priv(bond_dev); > + struct slave *slave; > + int i; > > bond->kill_timers = 0; > > + // restore slave->backup and slave->inactive Please use C-style comment. > + read_lock(&bond->lock); > + read_lock(&bond->curr_slave_lock); > + if (bond->slave_cnt > 0) { You can move the second read_lock() under this if(). -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 38a83ac..3ed9827 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -3419,9 +3419,27 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, int count) static int bond_open(struct net_device *bond_dev) { struct bonding *bond = netdev_priv(bond_dev); + struct slave *slave; + int i; bond->kill_timers = 0; + // restore slave->backup and slave->inactive + read_lock(&bond->lock); + read_lock(&bond->curr_slave_lock); + if (bond->slave_cnt > 0) { + bond_for_each_slave(bond, slave, i) { + if ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) + && (slave != bond->curr_active_slave)) { + bond_set_slave_inactive_flags(slave); + } else { + bond_set_slave_active_flags(slave); + } + } + } + read_unlock(&bond->curr_slave_lock); + read_unlock(&bond->lock); + INIT_DELAYED_WORK(&bond->mcast_work, bond_resend_igmp_join_requests_delayed); if (bond_is_lb(bond)) {
Eduard Sinelnikov (eduard.sinelnikov@gmail.com) found that if we change bonding mode from active backup to round robin, some slaves are still keeping "backup", and won't transmit packets. As Jay Vosburgh(fubar@us.ibm.com) pointed out that we can work around that by removing the bond_is_active_slave() check, because the "backup" flag is only meaningful for active backup mode. But if we just simply ignore the bond_is_active_slave() check, the transmission will work fine, but we can't maintain the correct value of "backup" flag for each slaves, though it is meaningless for other mode than active backup. I'd like to restore "backup" and "inactive" flag in bond_open, thus we can keep the correct value of them. As for bond_is_active_slave(), I'd like to prepare another patch to handle it. Signed-off-by: Weiping Pan <panweiping3@gmail.com> --- drivers/net/bonding/bond_main.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-)