Patch "mlxsw: spectrum_router: Avoid potential packets loss" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mlxsw: spectrum_router: Avoid potential packets loss
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mlxsw-spectrum_router-avoid-potential-packets-loss.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sat Mar 18 22:03:25 CST 2017
From: Ido Schimmel <[email protected]>
Date: Tue, 28 Feb 2017 08:55:40 +0100
Subject: mlxsw: spectrum_router: Avoid potential packets loss
From: Ido Schimmel <[email protected]>
[ Upstream commit f7df4923fa986247e93ec2cdff5ca168fff14dcf ]
When the structure of the LPM tree changes (f.e., due to the addition of a new prefix), we unbind the old tree and then bind the new one. This may result in temporary packet loss.
Instead, overwrite the old binding with the new one.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 30 ++++++++++++------ 1 file changed, 20 insertions(+), 10 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +20 -10
@@ -500,30 +500,40 @@ static int mlxsw_sp_vr_lpm_tree_check(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_vr *vr, struct mlxsw_sp_prefix_usage *req_prefix_usage) { - struct mlxsw_sp_lpm_tree *lpm_tree; + struct mlxsw_sp_lpm_tree *lpm_tree = vr->lpm_tree; +struct mlxsw_sp_lpm_tree *new_tree; +int err; -if (mlxsw_sp_prefix_usage_eq (req_prefix_usage, - &vr->lpm_tree->prefix_usage)) +if (mlxsw_sp_prefix_usage_eq (req_prefix_usage, &lpm_tree->prefix_usage))return 0 ; - lpm_tree =mlxsw_sp_lpm_tree_get (mlxsw_sp, req_prefix_usage, + new_tree =mlxsw_sp_lpm_tree_get (mlxsw_sp, req_prefix_usage, vr->proto, false); -if (IS_ERR (lpm_tree)) { +if (IS_ERR (new_tree)) {/* We failed to get a tree according to the required * prefix usage. However, the current tree might be still good * for us if our requirement is subset of the prefixes used * in the tree. */ if (mlxsw_sp_prefix_usage_subset (req_prefix_usage, - &vr->lpm_tree->prefix_usage)) + &lpm_tree->prefix_usage))return 0 ; -return PTR_ERR (lpm_tree); +return PTR_ERR (new_tree); } -mlxsw_sp_vr_lpm_tree_unbind (mlxsw_sp, vr); -mlxsw_sp_lpm_tree_put (mlxsw_sp, vr->lpm_tree); +/* Prevent packet loss by overwriting existing binding */ + vr->lpm_tree = new_tree; + err =mlxsw_sp_vr_lpm_tree_bind (mlxsw_sp, vr); +if (err) + goto err_tree_bind; +mlxsw_sp_lpm_tree_put (mlxsw_sp, lpm_tree); + +return 0 ; + +err_tree_bind: vr->lpm_tree = lpm_tree; -return mlxsw_sp_vr_lpm_tree_bind (mlxsw_sp, vr); +mlxsw_sp_lpm_tree_put (mlxsw_sp, new_tree); +return err; } static struct mlxsw_sp_vr *mlxsw_sp_vr_get(struct mlxsw_sp *mlxsw_sp,
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/mlxsw-spectrum_router-avoid-potential-packets-loss.patch