Commit 119d48fd authored by Maor Gottlieb's avatar Maor Gottlieb Committed by Saeed Mahameed

bonding: Export skip slave logic to function

As a preparation for following change that add array of
all slaves, extract code that skip slave to function.
Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Reviewed-by: default avatarJiri Pirko <jiri@mellanox.com>
Reviewed-by: default avatarJay Vosburgh <jay.vosburgh@canonical.com>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent cff9f12b
...@@ -4087,6 +4087,29 @@ static void bond_slave_arr_handler(struct work_struct *work) ...@@ -4087,6 +4087,29 @@ static void bond_slave_arr_handler(struct work_struct *work)
bond_slave_arr_work_rearm(bond, 1); 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 /* Build the usable slaves array in control path for modes that use xmit-hash
* to determine the slave interface - * to determine the slave interface -
* (a) BOND_MODE_8023AD * (a) BOND_MODE_8023AD
...@@ -4156,27 +4179,9 @@ int bond_update_slave_arr(struct bonding *bond, struct slave *skipslave) ...@@ -4156,27 +4179,9 @@ int bond_update_slave_arr(struct bonding *bond, struct slave *skipslave)
if (old_arr) if (old_arr)
kfree_rcu(old_arr, rcu); kfree_rcu(old_arr, rcu);
out: out:
if (ret != 0 && skipslave) { if (ret != 0 && skipslave)
int idx; bond_skip_slave(rtnl_dereference(bond->slave_arr), skipslave);
/* 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;
}
}
}
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment