Commit 7864a1ad authored by Veaceslav Falico's avatar Veaceslav Falico Committed by David S. Miller
Browse files

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: default avatarVeaceslav Falico <vfalico@redhat.com>
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c193f365
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -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,
			      struct slave *old_active)
{
	ASSERT_RTNL();

	if (old_active) {
		if (bond->dev->flags & IFF_PROMISC)
			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 slave *slave;

	read_lock(&bond->lock);
	ASSERT_RTNL();

	if (USES_PRIMARY(bond->params.mode)) {
		read_lock(&bond->curr_slave_lock);
		slave = bond->curr_active_slave;
		slave = rtnl_dereference(bond->curr_active_slave);
		if (slave) {
			dev_uc_sync(slave->dev, bond_dev);
			dev_mc_sync(slave->dev, bond_dev);
		}
		read_unlock(&bond->curr_slave_lock);
	} else {
		bond_for_each_slave(bond, slave) {
			dev_uc_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)