bonding: Add helper function to get the xmit slave based on hash
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>
This commit is contained in:
parent
34b37e204d
commit
c071d91d2a
|
@ -4185,6 +4185,23 @@ out:
|
||||||
return ret;
|
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
|
/* 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
|
* usable slave array is formed in the control path. The xmit function
|
||||||
* just calculates hash and sends the packet out.
|
* 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 net_device *dev)
|
||||||
{
|
{
|
||||||
struct bonding *bond = netdev_priv(dev);
|
struct bonding *bond = netdev_priv(dev);
|
||||||
struct slave *slave;
|
|
||||||
struct bond_up_slave *slaves;
|
struct bond_up_slave *slaves;
|
||||||
unsigned int count;
|
struct slave *slave;
|
||||||
|
|
||||||
slaves = rcu_dereference(bond->usable_slaves);
|
slaves = rcu_dereference(bond->usable_slaves);
|
||||||
count = slaves ? READ_ONCE(slaves->count) : 0;
|
slave = bond_xmit_3ad_xor_slave_get(bond, skb, slaves);
|
||||||
if (likely(count)) {
|
if (likely(slave))
|
||||||
slave = slaves->arr[bond_xmit_hash(bond, skb) % count];
|
|
||||||
bond_dev_queue_xmit(bond, skb, slave->dev);
|
bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
} else {
|
else
|
||||||
bond_tx_drop(dev, skb);
|
bond_tx_drop(dev, skb);
|
||||||
}
|
|
||||||
|
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue