bonding: use netdev_upper list in bond_vlan_used
authorVeaceslav Falico <vfalico@redhat.com>
Wed, 28 Aug 2013 21:25:09 +0000 (23:25 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Aug 2013 20:19:42 +0000 (16:19 -0400)
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>
drivers/net/bonding/bonding.h

index 4bf52d5f637ef687ef5bd9f31e848212c2b3ff62..230197d7abc7f732422a3b8e6a7bbbc333d24621 100644 (file)
@@ -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) \