[SRU][F:linux-bluefield][PATCH 21/32] bonding: Add helper function to get the xmit slave in rr mode
Daniel Jurgens
danielj at nvidia.com
Mon May 3 19:39:06 UTC 2021
From: Maor Gottlieb <maorg at mellanox.com>
BugLink: https://bugs.launchpad.net/bugs/1926994
Add helper function to get the xmit slave when bond is in round
robin mode. Change bond_xmit_slave_id to bond_get_slave_by_id, then
the logic for find the next slave for transmit could be used
both by the xmit flow and the .ndo to get the xmit slave.
Signed-off-by: Maor Gottlieb <maorg at mellanox.com>
Reviewed-by: Jiri Pirko <jiri at mellanox.com>
Reviewed-by: Jay Vosburgh <jay.vosburgh at canonical.com>
Acked-by: David S. Miller <davem at davemloft.net>
Signed-off-by: Saeed Mahameed <saeedm at mellanox.com>
(backported from commit 29d5bbccb3a171eb146c94efeb3d752fad3ddf7d)
Signed-off-by: Daniel Jurgens <danielj at nvidia.com>
Conflicts:
drivers/net/bonding/bond_main.c
---
drivers/net/bonding/bond_main.c | 43 ++++++++++++++++++++++++++---------------
1 file changed, 27 insertions(+), 16 deletions(-)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index a0f2697..7a838d2 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -3995,16 +3995,15 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
}
/**
- * bond_xmit_slave_id - transmit skb through slave with slave_id
+ * bond_get_slave_by_id - get xmit slave with slave_id
* @bond: bonding device that is transmitting
- * @skb: buffer to transmit
* @slave_id: slave id up to slave_cnt-1 through which to transmit
*
- * This function tries to transmit through slave with slave_id but in case
+ * This function tries to get slave with slave_id but in case
* it fails, it tries to find the first available slave for transmission.
- * The skb is consumed in all cases, thus the function is void.
*/
-static netdev_tx_t bond_xmit_slave_id(struct bonding *bond, struct sk_buff *skb, int slave_id)
+static struct slave *bond_get_slave_by_id(struct bonding *bond,
+ int slave_id)
{
struct list_head *iter;
struct slave *slave;
@@ -4014,7 +4013,7 @@ static netdev_tx_t bond_xmit_slave_id(struct bonding *bond, struct sk_buff *skb,
bond_for_each_slave_rcu(bond, slave, iter) {
if (--i < 0) {
if (bond_slave_can_tx(slave))
- return bond_dev_queue_xmit(bond, skb, slave->dev);
+ return slave;
}
}
@@ -4024,10 +4023,10 @@ static netdev_tx_t bond_xmit_slave_id(struct bonding *bond, struct sk_buff *skb,
if (--i < 0)
break;
if (bond_slave_can_tx(slave))
- return bond_dev_queue_xmit(bond, skb, slave->dev);
+ return slave;
}
- /* no slave that can tx has been found */
- return bond_tx_drop(bond->dev, skb);
+
+ return NULL;
}
/**
@@ -4063,10 +4062,9 @@ static u32 bond_rr_gen_slave_id(struct bonding *bond)
return slave_id;
}
-static netdev_tx_t bond_xmit_roundrobin(struct sk_buff *skb,
- struct net_device *bond_dev)
+static struct slave *bond_xmit_roundrobin_slave_get(struct bonding *bond,
+ struct sk_buff *skb)
{
- struct bonding *bond = netdev_priv(bond_dev);
struct slave *slave;
int slave_cnt;
u32 slave_id;
@@ -4088,17 +4086,30 @@ static netdev_tx_t bond_xmit_roundrobin(struct sk_buff *skb,
if (iph->protocol == IPPROTO_IGMP) {
slave = rcu_dereference(bond->curr_active_slave);
if (slave)
- return bond_dev_queue_xmit(bond, skb, slave->dev);
- return bond_xmit_slave_id(bond, skb, 0);
+ return slave;
+ return bond_get_slave_by_id(bond, 0);
}
}
non_igmp:
slave_cnt = READ_ONCE(bond->slave_cnt);
if (likely(slave_cnt)) {
- slave_id = bond_rr_gen_slave_id(bond);
- return bond_xmit_slave_id(bond, skb, slave_id % slave_cnt);
+ slave_id = bond_rr_gen_slave_id(bond) % slave_cnt;
+ return bond_get_slave_by_id(bond, slave_id);
}
+ return NULL;
+}
+
+static netdev_tx_t bond_xmit_roundrobin(struct sk_buff *skb,
+ struct net_device *bond_dev)
+{
+ struct bonding *bond = netdev_priv(bond_dev);
+ struct slave *slave;
+
+ slave = bond_xmit_roundrobin_slave_get(bond, skb);
+ if (slave)
+ return bond_dev_queue_xmit(bond, skb, slave->dev);
+
return bond_tx_drop(bond_dev, skb);
}
--
1.8.3.1
More information about the kernel-team
mailing list