Skip to content

Commit

Permalink
bonding: remove unwanted lock for bond enslave and release
Browse files Browse the repository at this point in the history
The bond_change_active_slave() and bond_select_active_slave()
do't need bond lock anymore, so remove the unwanted bond lock
for these two functions.

The bond_select_active_slave() will release and acquire
curr_slave_lock, so the curr_slave_lock need to protect
the function.

In bond enslave and bond release, the bond slave list is also
protected by RTNL, so bond lock is no need to exist, remove
the lock and clean the functions.

Suggested-by: Jay Vosburgh <fubar@us.ibm.com>
Suggested-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
dingtianhong authored and David S. Miller committed Dec 14, 2013
1 parent eb9fa4b commit c851703
Showing 1 changed file with 6 additions and 21 deletions.
27 changes: 6 additions & 21 deletions drivers/net/bonding/bond_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1589,11 +1589,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
bond_set_carrier(bond);

if (USES_PRIMARY(bond->params.mode)) {
read_lock(&bond->lock);
write_lock_bh(&bond->curr_slave_lock);
bond_select_active_slave(bond);
write_unlock_bh(&bond->curr_slave_lock);
read_unlock(&bond->lock);
}

pr_info("%s: enslaving %s as a%s interface with a%s link.\n",
Expand All @@ -1613,19 +1611,13 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
bond_hw_addr_flush(bond_dev, slave_dev);

vlan_vids_del_by_dev(slave_dev, bond_dev);
write_lock_bh(&bond->lock);
if (bond->primary_slave == new_slave)
bond->primary_slave = NULL;
if (bond->curr_active_slave == new_slave) {
bond_change_active_slave(bond, NULL);
write_unlock_bh(&bond->lock);
read_lock(&bond->lock);
write_lock_bh(&bond->curr_slave_lock);
bond_change_active_slave(bond, NULL);
bond_select_active_slave(bond);
write_unlock_bh(&bond->curr_slave_lock);
read_unlock(&bond->lock);
} else {
write_unlock_bh(&bond->lock);
}
slave_disable_netpoll(new_slave);

Expand Down Expand Up @@ -1690,20 +1682,16 @@ static int __bond_release_one(struct net_device *bond_dev,
}

block_netpoll_tx();
write_lock_bh(&bond->lock);

slave = bond_get_slave_by_dev(bond, slave_dev);
if (!slave) {
/* not a slave of this bond */
pr_info("%s: %s not enslaved\n",
bond_dev->name, slave_dev->name);
write_unlock_bh(&bond->lock);
unblock_netpoll_tx();
return -EINVAL;
}

write_unlock_bh(&bond->lock);

/* release the slave from its bond */
bond->slave_cnt--;

Expand All @@ -1721,6 +1709,7 @@ static int __bond_release_one(struct net_device *bond_dev,
*/
bond_3ad_unbind_slave(slave);
}
write_unlock_bh(&bond->lock);

pr_info("%s: releasing %s interface %s\n",
bond_dev->name,
Expand All @@ -1743,18 +1732,19 @@ static int __bond_release_one(struct net_device *bond_dev,
if (bond->primary_slave == slave)
bond->primary_slave = NULL;

if (oldcurrent == slave)
if (oldcurrent == slave) {
write_lock_bh(&bond->curr_slave_lock);
bond_change_active_slave(bond, NULL);
write_unlock_bh(&bond->curr_slave_lock);
}

if (bond_is_lb(bond)) {
/* Must be called only after the slave has been
* detached from the list and the curr_active_slave
* has been cleared (if our_slave == old_current),
* but before a new active slave is selected.
*/
write_unlock_bh(&bond->lock);
bond_alb_deinit_slave(bond, slave);
write_lock_bh(&bond->lock);
}

if (all) {
Expand All @@ -1765,15 +1755,11 @@ static int __bond_release_one(struct net_device *bond_dev,
* is no concern that another slave add/remove event
* will interfere.
*/
write_unlock_bh(&bond->lock);
read_lock(&bond->lock);
write_lock_bh(&bond->curr_slave_lock);

bond_select_active_slave(bond);

write_unlock_bh(&bond->curr_slave_lock);
read_unlock(&bond->lock);
write_lock_bh(&bond->lock);
}

if (!bond_has_slaves(bond)) {
Expand All @@ -1788,7 +1774,6 @@ static int __bond_release_one(struct net_device *bond_dev,
}
}

write_unlock_bh(&bond->lock);
unblock_netpoll_tx();
synchronize_rcu();

Expand Down

0 comments on commit c851703

Please sign in to comment.