Convert alb_send_learning_packets and bond_has_this_ip to use the new
netdev_walk_all_upper_dev_rcu API. In both cases this is just a move
to the new API; no functional change is intended.

Signed-off-by: David Ahern <d...@cumulusnetworks.com>
---
 drivers/net/bonding/bond_alb.c  | 82 ++++++++++++++++++++++++++---------------
 drivers/net/bonding/bond_main.c | 21 +++++++----
 2 files changed, 65 insertions(+), 38 deletions(-)

diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
index 551f0f8dead3..1ddedec61900 100644
--- a/drivers/net/bonding/bond_alb.c
+++ b/drivers/net/bonding/bond_alb.c
@@ -950,13 +950,61 @@ static void alb_send_lp_vid(struct slave *slave, u8 
mac_addr[],
        dev_queue_xmit(skb);
 }
 
+struct alb_walk_data {
+       struct bonding *bond;
+       struct slave *slave;
+       u8 *mac_addr;
+       bool strict_match;
+};
+
+static int alb_upper_dev_walk(struct net_device *upper, void *data)
+{
+       struct alb_walk_data *_data = (struct alb_walk_data *)data;
+       bool strict_match = _data->strict_match;
+       struct bonding *bond = _data->bond;
+       struct slave *slave = _data->slave;
+       u8 *mac_addr = _data->mac_addr;
+       struct bond_vlan_tag *tags;
+
+       if (is_vlan_dev(upper) && vlan_get_encap_level(upper) == 0) {
+               if (strict_match &&
+                   ether_addr_equal_64bits(mac_addr,
+                                           upper->dev_addr)) {
+                       alb_send_lp_vid(slave, mac_addr,
+                                       vlan_dev_vlan_proto(upper),
+                                       vlan_dev_vlan_id(upper));
+               } else if (!strict_match) {
+                       alb_send_lp_vid(slave, upper->dev_addr,
+                                       vlan_dev_vlan_proto(upper),
+                                       vlan_dev_vlan_id(upper));
+               }
+       }
+
+       /* If this is a macvlan device, then only send updates
+        * when strict_match is turned off.
+        */
+       if (netif_is_macvlan(upper) && !strict_match) {
+               tags = bond_verify_device_path(bond->dev, upper, 0);
+               if (IS_ERR_OR_NULL(tags))
+                       BUG();
+               alb_send_lp_vid(slave, upper->dev_addr,
+                               tags[0].vlan_proto, tags[0].vlan_id);
+               kfree(tags);
+       }
+
+       return 0;
+}
+
 static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[],
                                      bool strict_match)
 {
        struct bonding *bond = bond_get_bond_by_slave(slave);
-       struct net_device *upper;
-       struct list_head *iter;
-       struct bond_vlan_tag *tags;
+       struct alb_walk_data data = {
+               .strict_match = strict_match,
+               .mac_addr = mac_addr,
+               .slave = slave,
+               .bond = bond,
+       };
 
        /* send untagged */
        alb_send_lp_vid(slave, mac_addr, 0, 0);
@@ -965,33 +1013,7 @@ static void alb_send_learning_packets(struct slave 
*slave, u8 mac_addr[],
         * for that device.
         */
        rcu_read_lock();
-       netdev_for_each_all_upper_dev_rcu(bond->dev, upper, iter) {
-               if (is_vlan_dev(upper) && vlan_get_encap_level(upper) == 0) {
-                       if (strict_match &&
-                           ether_addr_equal_64bits(mac_addr,
-                                                   upper->dev_addr)) {
-                               alb_send_lp_vid(slave, mac_addr,
-                                               vlan_dev_vlan_proto(upper),
-                                               vlan_dev_vlan_id(upper));
-                       } else if (!strict_match) {
-                               alb_send_lp_vid(slave, upper->dev_addr,
-                                               vlan_dev_vlan_proto(upper),
-                                               vlan_dev_vlan_id(upper));
-                       }
-               }
-
-               /* If this is a macvlan device, then only send updates
-                * when strict_match is turned off.
-                */
-               if (netif_is_macvlan(upper) && !strict_match) {
-                       tags = bond_verify_device_path(bond->dev, upper, 0);
-                       if (IS_ERR_OR_NULL(tags))
-                               BUG();
-                       alb_send_lp_vid(slave, upper->dev_addr,
-                                       tags[0].vlan_proto, tags[0].vlan_id);
-                       kfree(tags);
-               }
-       }
+       netdev_walk_all_upper_dev_rcu(bond->dev, alb_upper_dev_walk, &data);
        rcu_read_unlock();
 }
 
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 3f31ca32f52b..2b4134d5e081 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -2270,22 +2270,27 @@ static void bond_mii_monitor(struct work_struct *work)
        }
 }
 
+static int bond_upper_dev_walk(struct net_device *upper, void *data)
+{
+       __be32 ip = *((__be32 *)data);
+       int ret = 0;
+
+       if (ip == bond_confirm_addr(upper, 0, ip))
+               ret = 1;
+
+       return ret;
+}
+
 static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
 {
-       struct net_device *upper;
-       struct list_head *iter;
        bool ret = false;
 
        if (ip == bond_confirm_addr(bond->dev, 0, ip))
                return true;
 
        rcu_read_lock();
-       netdev_for_each_all_upper_dev_rcu(bond->dev, upper, iter) {
-               if (ip == bond_confirm_addr(upper, 0, ip)) {
-                       ret = true;
-                       break;
-               }
-       }
+       if (netdev_walk_all_upper_dev_rcu(bond->dev, bond_upper_dev_walk, &ip))
+               ret = true;
        rcu_read_unlock();
 
        return ret;
-- 
2.1.4

Reply via email to