Skip to content

Commit

Permalink
bonding: do not acquire rtnl in ARP monitor
Browse files Browse the repository at this point in the history
	The ARP monitor functions currently acquire RTNL when performing
failover operations, but do so incorrectly (out of order).  This causes
various warnings from might_sleep.

	The ARP monitor isn't supported for any of the bonding modes
that actually require RTNL, so it is safe to not hold RTNL when
failing over in the ARP monitor.

Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jay Vosburgh authored and David S. Miller committed Feb 3, 2008
1 parent 2439f9e commit 21c9d8d
Showing 1 changed file with 0 additions and 12 deletions.
12 changes: 0 additions & 12 deletions drivers/net/bonding/bond_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2801,14 +2801,11 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
}

if (do_failover) {
rtnl_lock();
write_lock_bh(&bond->curr_slave_lock);

bond_select_active_slave(bond);

write_unlock_bh(&bond->curr_slave_lock);
rtnl_unlock();

}

re_arm:
Expand Down Expand Up @@ -2865,8 +2862,6 @@ void bond_activebackup_arp_mon(struct work_struct *work)

slave->link = BOND_LINK_UP;

rtnl_lock();

write_lock_bh(&bond->curr_slave_lock);

if ((!bond->curr_active_slave) &&
Expand Down Expand Up @@ -2902,7 +2897,6 @@ void bond_activebackup_arp_mon(struct work_struct *work)
}

write_unlock_bh(&bond->curr_slave_lock);
rtnl_unlock();
}
} else {
read_lock(&bond->curr_slave_lock);
Expand Down Expand Up @@ -2972,16 +2966,13 @@ void bond_activebackup_arp_mon(struct work_struct *work)
bond->dev->name,
slave->dev->name);

rtnl_lock();
write_lock_bh(&bond->curr_slave_lock);

bond_select_active_slave(bond);
slave = bond->curr_active_slave;

write_unlock_bh(&bond->curr_slave_lock);

rtnl_unlock();

bond->current_arp_slave = slave;

if (slave) {
Expand All @@ -2999,13 +2990,10 @@ void bond_activebackup_arp_mon(struct work_struct *work)
bond->primary_slave->dev->name);

/* primary is up so switch to it */
rtnl_lock();
write_lock_bh(&bond->curr_slave_lock);
bond_change_active_slave(bond, bond->primary_slave);
write_unlock_bh(&bond->curr_slave_lock);

rtnl_unlock();

slave = bond->primary_slave;
slave->jiffies = jiffies;
} else {
Expand Down

0 comments on commit 21c9d8d

Please sign in to comment.