diff options
author | Veaceslav Falico <vfalico@redhat.com> | 2013-08-28 17:25:09 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-29 16:19:42 -0400 |
commit | c752af2c555617017dbb3a66f81e974b66ad5e2d (patch) | |
tree | 3f7ff263c2b69d1393016fe1c61f627a51949cf7 | |
parent | 8b5be8561b804edf6b58fc27edbccf1d45863e08 (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.h | 15 |
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() */ | ||
270 | static inline bool bond_vlan_used(struct bonding *bond) | 271 | static 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) \ |