aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding
diff options
context:
space:
mode:
authorJay Vosburgh <fubar@us.ibm.com>2010-07-21 08:14:48 -0400
committerDavid S. Miller <davem@davemloft.net>2010-07-22 17:14:47 -0400
commit03dc2f4c525afb9488edb687c2e1f7057d59b40e (patch)
tree59702784f96f5a7427e4053c65845aad9a2d1d68 /drivers/net/bonding
parentf35188faa0fbabefac476536994f4b6f3677380f (diff)
bonding: don't lock when copying/clearing VLAN list on slave
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>
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r--drivers/net/bonding/bond_main.c16
1 files changed, 3 insertions, 13 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index f3b01ce4f629..2cc4cfc31892 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -570,10 +570,8 @@ static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *sla
570 struct vlan_entry *vlan; 570 struct vlan_entry *vlan;
571 const struct net_device_ops *slave_ops = slave_dev->netdev_ops; 571 const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
572 572
573 write_lock_bh(&bond->lock);
574
575 if (!bond->vlgrp) 573 if (!bond->vlgrp)
576 goto out; 574 return;
577 575
578 if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && 576 if ((slave_dev->features & NETIF_F_HW_VLAN_RX) &&
579 slave_ops->ndo_vlan_rx_register) 577 slave_ops->ndo_vlan_rx_register)
@@ -581,13 +579,10 @@ static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *sla
581 579
582 if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) || 580 if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) ||
583 !(slave_ops->ndo_vlan_rx_add_vid)) 581 !(slave_ops->ndo_vlan_rx_add_vid))
584 goto out; 582 return;
585 583
586 list_for_each_entry(vlan, &bond->vlan_list, vlan_list) 584 list_for_each_entry(vlan, &bond->vlan_list, vlan_list)
587 slave_ops->ndo_vlan_rx_add_vid(slave_dev, vlan->vlan_id); 585 slave_ops->ndo_vlan_rx_add_vid(slave_dev, vlan->vlan_id);
588
589out:
590 write_unlock_bh(&bond->lock);
591} 586}
592 587
593static void bond_del_vlans_from_slave(struct bonding *bond, 588static void bond_del_vlans_from_slave(struct bonding *bond,
@@ -597,10 +592,8 @@ static void bond_del_vlans_from_slave(struct bonding *bond,
597 struct vlan_entry *vlan; 592 struct vlan_entry *vlan;
598 struct net_device *vlan_dev; 593 struct net_device *vlan_dev;
599 594
600 write_lock_bh(&bond->lock);
601
602 if (!bond->vlgrp) 595 if (!bond->vlgrp)
603 goto out; 596 return;
604 597
605 if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) || 598 if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) ||
606 !(slave_ops->ndo_vlan_rx_kill_vid)) 599 !(slave_ops->ndo_vlan_rx_kill_vid))
@@ -621,9 +614,6 @@ unreg:
621 if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && 614 if ((slave_dev->features & NETIF_F_HW_VLAN_RX) &&
622 slave_ops->ndo_vlan_rx_register) 615 slave_ops->ndo_vlan_rx_register)
623 slave_ops->ndo_vlan_rx_register(slave_dev, NULL); 616 slave_ops->ndo_vlan_rx_register(slave_dev, NULL);
624
625out:
626 write_unlock_bh(&bond->lock);
627} 617}
628 618
629/*------------------------------- Link status -------------------------------*/ 619/*------------------------------- Link status -------------------------------*/