aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVeaceslav Falico <vfalico@redhat.com>2013-08-28 17:25:09 -0400
committerDavid S. Miller <davem@davemloft.net>2013-08-29 16:19:42 -0400
commitc752af2c555617017dbb3a66f81e974b66ad5e2d (patch)
tree3f7ff263c2b69d1393016fe1c61f627a51949cf7
parent8b5be8561b804edf6b58fc27edbccf1d45863e08 (diff)
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>
-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 {
267#endif /* CONFIG_DEBUG_FS */ 267#endif /* CONFIG_DEBUG_FS */
268}; 268};
269 269
270/* if we hold rtnl_lock() - call vlan_uses_dev() */
270static inline bool bond_vlan_used(struct bonding *bond) 271static inline bool bond_vlan_used(struct bonding *bond)
271{ 272{
272 return !list_empty(&bond->vlan_list); 273 struct net_device *upper;
274 struct list_head *iter;
275
276 rcu_read_lock();
277 netdev_for_each_upper_dev_rcu(bond->dev, upper, iter) {
278 if (upper->priv_flags & IFF_802_1Q_VLAN) {
279 rcu_read_unlock();
280 return true;
281 }
282 }
283 rcu_read_unlock();
284
285 return false;
273} 286}
274 287
275#define bond_slave_get_rcu(dev) \ 288#define bond_slave_get_rcu(dev) \