]> git.baikalelectronics.ru Git - kernel.git/commitdiff
bonding: Export skip slave logic to function
authorMaor Gottlieb <maorg@mellanox.com>
Thu, 30 Apr 2020 19:21:32 +0000 (22:21 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 10:41:05 +0000 (11:41 +0100)
[ Upstream commit 9b8ab437a7ba3c80012e39cb9651e9f5727932ef ]

As a preparation for following change that add array of
all slaves, extract code that skip slave to function.

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>
Stable-dep-of: f8a65ab2f3ff ("bonding: fix link recovery in mode 2 when updelay is nonzero")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/bonding/bond_main.c

index 246bcbd650b4b9dc35a94686eadd113428b6f6d9..0e797730bab3a8dc8acc11a9398141332df4ce5e 100644 (file)
@@ -4040,6 +4040,29 @@ err:
        bond_slave_arr_work_rearm(bond, 1);
 }
 
+static void bond_skip_slave(struct bond_up_slave *slaves,
+                           struct slave *skipslave)
+{
+       int idx;
+
+       /* Rare situation where caller has asked to skip a specific
+        * slave but allocation failed (most likely!). BTW this is
+        * only possible when the call is initiated from
+        * __bond_release_one(). In this situation; overwrite the
+        * skipslave entry in the array with the last entry from the
+        * array to avoid a situation where the xmit path may choose
+        * this to-be-skipped slave to send a packet out.
+        */
+       for (idx = 0; slaves && idx < slaves->count; idx++) {
+               if (skipslave == slaves->arr[idx]) {
+                       slaves->arr[idx] =
+                               slaves->arr[slaves->count - 1];
+                       slaves->count--;
+                       break;
+               }
+       }
+}
+
 /* Build the usable slaves array in control path for modes that use xmit-hash
  * to determine the slave interface -
  * (a) BOND_MODE_8023AD
@@ -4109,27 +4132,9 @@ int bond_update_slave_arr(struct bonding *bond, struct slave *skipslave)
        if (old_arr)
                kfree_rcu(old_arr, rcu);
 out:
-       if (ret != 0 && skipslave) {
-               int idx;
-
-               /* Rare situation where caller has asked to skip a specific
-                * slave but allocation failed (most likely!). BTW this is
-                * only possible when the call is initiated from
-                * __bond_release_one(). In this situation; overwrite the
-                * skipslave entry in the array with the last entry from the
-                * array to avoid a situation where the xmit path may choose
-                * this to-be-skipped slave to send a packet out.
-                */
-               old_arr = rtnl_dereference(bond->slave_arr);
-               for (idx = 0; old_arr != NULL && idx < old_arr->count; idx++) {
-                       if (skipslave == old_arr->arr[idx]) {
-                               old_arr->arr[idx] =
-                                   old_arr->arr[old_arr->count-1];
-                               old_arr->count--;
-                               break;
-                       }
-               }
-       }
+       if (ret != 0 && skipslave)
+               bond_skip_slave(rtnl_dereference(bond->slave_arr), skipslave);
+
        return ret;
 }