Skip to content

Commit a69518c

Browse files
idoschdavem330
authored andcommitted
mlxsw: spectrum_router: Avoid expensive lookup during route removal
In commit fc922bb ("mlxsw: spectrum_router: Use one LPM tree for all virtual routers") I increased the scale of supported VRFs by having all of them share the same LPM tree. In order to avoid look-ups for prefix lengths that don't exist, each route removal would trigger an aggregation across all the active virtual routers to see which prefix lengths are in use and which aren't and structure the tree accordingly. With the way the data structures are currently laid out, this is a very expensive operation. When preformed repeatedly - due to the invocation of the abort mechanism - and with enough VRFs, this can result in a hung task. For now, avoid this optimization until it can be properly re-added in net-next. Fixes: fc922bb ("mlxsw: spectrum_router: Use one LPM tree for all virtual routers") Signed-off-by: Ido Schimmel <idosch@mellanox.com> Reported-by: David Ahern <dsa@cumulusnetworks.com> Tested-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 8fe2d6c commit a69518c

File tree

1 file changed

+0
-14
lines changed

1 file changed

+0
-14
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3505,20 +3505,6 @@ static int mlxsw_sp_fib_lpm_tree_link(struct mlxsw_sp *mlxsw_sp,
35053505
static void mlxsw_sp_fib_lpm_tree_unlink(struct mlxsw_sp *mlxsw_sp,
35063506
struct mlxsw_sp_fib *fib)
35073507
{
3508-
struct mlxsw_sp_prefix_usage req_prefix_usage = {{ 0 } };
3509-
struct mlxsw_sp_lpm_tree *lpm_tree;
3510-
3511-
/* Aggregate prefix lengths across all virtual routers to make
3512-
* sure we only have used prefix lengths in the LPM tree.
3513-
*/
3514-
mlxsw_sp_vrs_prefixes(mlxsw_sp, fib->proto, &req_prefix_usage);
3515-
lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage,
3516-
fib->proto);
3517-
if (IS_ERR(lpm_tree))
3518-
goto err_tree_get;
3519-
mlxsw_sp_vrs_lpm_tree_replace(mlxsw_sp, fib, lpm_tree);
3520-
3521-
err_tree_get:
35223508
if (!mlxsw_sp_prefix_usage_none(&fib->prefix_usage))
35233509
return;
35243510
mlxsw_sp_vr_lpm_tree_unbind(mlxsw_sp, fib);

0 commit comments

Comments
 (0)