bonding: Add helper function to get the xmit slave based on hash
authorMaor Gottlieb <maorg@mellanox.com>
Thu, 30 Apr 2020 19:21:35 +0000 (22:21 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 1 May 2020 19:15:37 +0000 (12:15 -0700)
Both xor and 802.3ad modes use bond_xmit_hash to get the xmit slave.
Export the logic to helper function so it could be used in the
following patches by the .ndo to get the xmit slave.

Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Jay Vosburgh <jay.vosburgh@canonical.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/bonding/bond_main.c

index 2cb41d4..8e63059 100644 (file)
@@ -4185,6 +4185,23 @@ out:
        return ret;
 }
 
+static struct slave *bond_xmit_3ad_xor_slave_get(struct bonding *bond,
+                                                struct sk_buff *skb,
+                                                struct bond_up_slave *slaves)
+{
+       struct slave *slave;
+       unsigned int count;
+       u32 hash;
+
+       hash = bond_xmit_hash(bond, skb);
+       count = slaves ? READ_ONCE(slaves->count) : 0;
+       if (unlikely(!count))
+               return NULL;
+
+       slave = slaves->arr[hash % count];
+       return slave;
+}
+
 /* Use this Xmit function for 3AD as well as XOR modes. The current
  * usable slave array is formed in the control path. The xmit function
  * just calculates hash and sends the packet out.
@@ -4193,18 +4210,15 @@ static netdev_tx_t bond_3ad_xor_xmit(struct sk_buff *skb,
                                     struct net_device *dev)
 {
        struct bonding *bond = netdev_priv(dev);
-       struct slave *slave;
        struct bond_up_slave *slaves;
-       unsigned int count;
+       struct slave *slave;
 
        slaves = rcu_dereference(bond->usable_slaves);
-       count = slaves ? READ_ONCE(slaves->count) : 0;
-       if (likely(count)) {
-               slave = slaves->arr[bond_xmit_hash(bond, skb) % count];
+       slave = bond_xmit_3ad_xor_slave_get(bond, skb, slaves);
+       if (likely(slave))
                bond_dev_queue_xmit(bond, skb, slave->dev);
-       } else {
+       else
                bond_tx_drop(dev, skb);
-       }
 
        return NETDEV_TX_OK;
 }