bonding: remove locking from bond_set_rx_mode()

We're already protected by RTNL lock, so nothing can happen to bond/its
slaves, and thus the locking is useless here (both bond->lock and
bond->curr_active_slave).

Also, add ASSERT_RTNL() both to bond_set_rx_mode() and bond_hw_addr_swap()
to catch possible uses of it without RTNL locking.

This patch also saves us from a lockdep false-positive in
bond_set_rx_mode() vs bond_hw_addr_swap().

CC: Jay Vosburgh <fubar@us.ibm.com>
CC: Andy Gospodarek <andy@greyhouse.net>
CC: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Veaceslav Falico 2013-08-05 14:56:06 +02:00 committed by David S. Miller
parent c193f3655d
commit 7864a1adf7
1 changed files with 4 additions and 6 deletions

View File

@ -776,6 +776,8 @@ static void bond_hw_addr_flush(struct net_device *bond_dev,
static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active, static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active,
struct slave *old_active) struct slave *old_active)
{ {
ASSERT_RTNL();
if (old_active) { if (old_active) {
if (bond->dev->flags & IFF_PROMISC) if (bond->dev->flags & IFF_PROMISC)
dev_set_promiscuity(old_active->dev, -1); dev_set_promiscuity(old_active->dev, -1);
@ -3551,24 +3553,20 @@ static void bond_set_rx_mode(struct net_device *bond_dev)
struct bonding *bond = netdev_priv(bond_dev); struct bonding *bond = netdev_priv(bond_dev);
struct slave *slave; struct slave *slave;
read_lock(&bond->lock); ASSERT_RTNL();
if (USES_PRIMARY(bond->params.mode)) { if (USES_PRIMARY(bond->params.mode)) {
read_lock(&bond->curr_slave_lock); slave = rtnl_dereference(bond->curr_active_slave);
slave = bond->curr_active_slave;
if (slave) { if (slave) {
dev_uc_sync(slave->dev, bond_dev); dev_uc_sync(slave->dev, bond_dev);
dev_mc_sync(slave->dev, bond_dev); dev_mc_sync(slave->dev, bond_dev);
} }
read_unlock(&bond->curr_slave_lock);
} else { } else {
bond_for_each_slave(bond, slave) { bond_for_each_slave(bond, slave) {
dev_uc_sync_multiple(slave->dev, bond_dev); dev_uc_sync_multiple(slave->dev, bond_dev);
dev_mc_sync_multiple(slave->dev, bond_dev); dev_mc_sync_multiple(slave->dev, bond_dev);
} }
} }
read_unlock(&bond->lock);
} }
static int bond_neigh_init(struct neighbour *n) static int bond_neigh_init(struct neighbour *n)