diff mbox series

[SRU,F:linux-bluefield,21/32] bonding: Add helper function to get the xmit slave in rr mode

Message ID 1620070757-51528-22-git-send-email-danielj@nvidia.com
State New
Headers show
Series TLS Bonding Backport | expand

Commit Message

Daniel Jurgens May 3, 2021, 7:39 p.m. UTC
From: Maor Gottlieb <maorg@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@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>
(backported from commit 29d5bbccb3a171eb146c94efeb3d752fad3ddf7d)
Signed-off-by: Daniel Jurgens <danielj@nvidia.com>

Conflicts:
	drivers/net/bonding/bond_main.c
---
 drivers/net/bonding/bond_main.c | 43 ++++++++++++++++++++++++++---------------
 1 file changed, 27 insertions(+), 16 deletions(-)
diff mbox series

Patch

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);
 }