summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorVeaceslav Falico <vfalico@redhat.com>2013-08-29 01:25:09 +0400
committerDavid S. Miller <davem@davemloft.net>2013-08-30 00:19:42 +0400
commitc752af2c555617017dbb3a66f81e974b66ad5e2d (patch)
tree3f7ff263c2b69d1393016fe1c61f627a51949cf7 /drivers/net
parent8b5be8561b804edf6b58fc27edbccf1d45863e08 (diff)
downloadlinux-c752af2c555617017dbb3a66f81e974b66ad5e2d.tar.xz
bonding: use netdev_upper list in bond_vlan_used
Convert bond_vlan_used() to traverse the upper device list to see if we have any vlans above us. It's protected by rcu, and in case we are holding rtnl_lock we should call vlan_uses_dev() instead - it's faster. CC: Jay Vosburgh <fubar@us.ibm.com> CC: Andy Gospodarek <andy@greyhouse.net> Signed-off-by: Veaceslav Falico <vfalico@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/bonding/bonding.h15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index 4bf52d5f637e..230197d7abc7 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -267,9 +267,22 @@ struct bonding {
#endif /* CONFIG_DEBUG_FS */
};
+/* if we hold rtnl_lock() - call vlan_uses_dev() */
static inline bool bond_vlan_used(struct bonding *bond)
{
- return !list_empty(&bond->vlan_list);
+ struct net_device *upper;
+ struct list_head *iter;
+
+ rcu_read_lock();
+ netdev_for_each_upper_dev_rcu(bond->dev, upper, iter) {
+ if (upper->priv_flags & IFF_802_1Q_VLAN) {
+ rcu_read_unlock();
+ return true;
+ }
+ }
+ rcu_read_unlock();
+
+ return false;
}
#define bond_slave_get_rcu(dev) \