Message ID | 20171008095326.1238-1-jiri@resnulli.us |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | [net] mlxsw: spectrum_router: Avoid expensive lookup during route removal | expand |
From: Jiri Pirko <jiri@resnulli.us> Date: Sun, 8 Oct 2017 11:53:26 +0200 > From: Ido Schimmel <idosch@mellanox.com> > > In commit fc922bb0dd94 ("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: fc922bb0dd94 ("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> Applied.
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 032089e..c16718d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -3505,20 +3505,6 @@ static int mlxsw_sp_fib_lpm_tree_link(struct mlxsw_sp *mlxsw_sp, static void mlxsw_sp_fib_lpm_tree_unlink(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fib *fib) { - struct mlxsw_sp_prefix_usage req_prefix_usage = {{ 0 } }; - struct mlxsw_sp_lpm_tree *lpm_tree; - - /* Aggregate prefix lengths across all virtual routers to make - * sure we only have used prefix lengths in the LPM tree. - */ - mlxsw_sp_vrs_prefixes(mlxsw_sp, fib->proto, &req_prefix_usage); - lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage, - fib->proto); - if (IS_ERR(lpm_tree)) - goto err_tree_get; - mlxsw_sp_vrs_lpm_tree_replace(mlxsw_sp, fib, lpm_tree); - -err_tree_get: if (!mlxsw_sp_prefix_usage_none(&fib->prefix_usage)) return; mlxsw_sp_vr_lpm_tree_unbind(mlxsw_sp, fib);