bonding: don't lock when copying/clearing VLAN list on slave
authorJay Vosburgh <fubar@us.ibm.com>
Wed, 21 Jul 2010 12:14:48 +0000 (12:14 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Jul 2010 21:14:47 +0000 (14:14 -0700)
When copying VLAN information to or removing from a slave
during slave addition or removal, the bonding code currently holds
the bond->lock for write to prevent concurrent modification of the
vlan_list / vlgrp.

This is unnecessary, as all of these operations occur under
RTNL.  Holding the bond->lock also caused might_sleep issues for
some drivers' ndo_vlan_* functions.  This patch removes the extra
locking.

Problem reported by Michael Chan <mchan@broadcom.com>

Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Cc: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c

index f3b01ce4f629d416eaca43a8e1abafcf8c592be7..2cc4cfc31892cd85458dec20b6c46401fdb90d9b 100644 (file)
@@ -570,10 +570,8 @@ static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *sla
        struct vlan_entry *vlan;
        const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
 
-       write_lock_bh(&bond->lock);
-
        if (!bond->vlgrp)
-               goto out;
+               return;
 
        if ((slave_dev->features & NETIF_F_HW_VLAN_RX) &&
            slave_ops->ndo_vlan_rx_register)
@@ -581,13 +579,10 @@ static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *sla
 
        if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) ||
            !(slave_ops->ndo_vlan_rx_add_vid))
-               goto out;
+               return;
 
        list_for_each_entry(vlan, &bond->vlan_list, vlan_list)
                slave_ops->ndo_vlan_rx_add_vid(slave_dev, vlan->vlan_id);
-
-out:
-       write_unlock_bh(&bond->lock);
 }
 
 static void bond_del_vlans_from_slave(struct bonding *bond,
@@ -597,10 +592,8 @@ static void bond_del_vlans_from_slave(struct bonding *bond,
        struct vlan_entry *vlan;
        struct net_device *vlan_dev;
 
-       write_lock_bh(&bond->lock);
-
        if (!bond->vlgrp)
-               goto out;
+               return;
 
        if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) ||
            !(slave_ops->ndo_vlan_rx_kill_vid))
@@ -621,9 +614,6 @@ unreg:
        if ((slave_dev->features & NETIF_F_HW_VLAN_RX) &&
            slave_ops->ndo_vlan_rx_register)
                slave_ops->ndo_vlan_rx_register(slave_dev, NULL);
-
-out:
-       write_unlock_bh(&bond->lock);
 }
 
 /*------------------------------- Link status -------------------------------*/