Commit 382dbb40 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

mlxsw: spectrum_router: Simplify LPM tree allocation

When looking for a new LPM tree we should always consider all the unused
trees. It doesn't matter if the new tree is required due to changes in
currently used prefixes inside an existing routing table or because a
route was inserted into an empty table.

Both cases are functionally identical and therefore should be treated
the same.

When looking for a new LPM tree, consider all unused trees and don't
reserve trees for specific cases.
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4724ba56
...@@ -196,20 +196,16 @@ static void mlxsw_sp_fib_destroy(struct mlxsw_sp_fib *fib) ...@@ -196,20 +196,16 @@ static void mlxsw_sp_fib_destroy(struct mlxsw_sp_fib *fib)
} }
static struct mlxsw_sp_lpm_tree * static struct mlxsw_sp_lpm_tree *
mlxsw_sp_lpm_tree_find_unused(struct mlxsw_sp *mlxsw_sp, bool one_reserved) mlxsw_sp_lpm_tree_find_unused(struct mlxsw_sp *mlxsw_sp)
{ {
static struct mlxsw_sp_lpm_tree *lpm_tree; static struct mlxsw_sp_lpm_tree *lpm_tree;
int i; int i;
for (i = 0; i < MLXSW_SP_LPM_TREE_COUNT; i++) { for (i = 0; i < MLXSW_SP_LPM_TREE_COUNT; i++) {
lpm_tree = &mlxsw_sp->router.lpm_trees[i]; lpm_tree = &mlxsw_sp->router.lpm_trees[i];
if (lpm_tree->ref_count == 0) { if (lpm_tree->ref_count == 0)
if (one_reserved)
one_reserved = false;
else
return lpm_tree; return lpm_tree;
} }
}
return NULL; return NULL;
} }
...@@ -262,12 +258,12 @@ mlxsw_sp_lpm_tree_left_struct_set(struct mlxsw_sp *mlxsw_sp, ...@@ -262,12 +258,12 @@ mlxsw_sp_lpm_tree_left_struct_set(struct mlxsw_sp *mlxsw_sp,
static struct mlxsw_sp_lpm_tree * static struct mlxsw_sp_lpm_tree *
mlxsw_sp_lpm_tree_create(struct mlxsw_sp *mlxsw_sp, mlxsw_sp_lpm_tree_create(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_prefix_usage *prefix_usage, struct mlxsw_sp_prefix_usage *prefix_usage,
enum mlxsw_sp_l3proto proto, bool one_reserved) enum mlxsw_sp_l3proto proto)
{ {
struct mlxsw_sp_lpm_tree *lpm_tree; struct mlxsw_sp_lpm_tree *lpm_tree;
int err; int err;
lpm_tree = mlxsw_sp_lpm_tree_find_unused(mlxsw_sp, one_reserved); lpm_tree = mlxsw_sp_lpm_tree_find_unused(mlxsw_sp);
if (!lpm_tree) if (!lpm_tree)
return ERR_PTR(-EBUSY); return ERR_PTR(-EBUSY);
lpm_tree->proto = proto; lpm_tree->proto = proto;
...@@ -297,7 +293,7 @@ static int mlxsw_sp_lpm_tree_destroy(struct mlxsw_sp *mlxsw_sp, ...@@ -297,7 +293,7 @@ static int mlxsw_sp_lpm_tree_destroy(struct mlxsw_sp *mlxsw_sp,
static struct mlxsw_sp_lpm_tree * static struct mlxsw_sp_lpm_tree *
mlxsw_sp_lpm_tree_get(struct mlxsw_sp *mlxsw_sp, mlxsw_sp_lpm_tree_get(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_prefix_usage *prefix_usage, struct mlxsw_sp_prefix_usage *prefix_usage,
enum mlxsw_sp_l3proto proto, bool one_reserved) enum mlxsw_sp_l3proto proto)
{ {
struct mlxsw_sp_lpm_tree *lpm_tree; struct mlxsw_sp_lpm_tree *lpm_tree;
int i; int i;
...@@ -311,7 +307,7 @@ mlxsw_sp_lpm_tree_get(struct mlxsw_sp *mlxsw_sp, ...@@ -311,7 +307,7 @@ mlxsw_sp_lpm_tree_get(struct mlxsw_sp *mlxsw_sp,
goto inc_ref_count; goto inc_ref_count;
} }
lpm_tree = mlxsw_sp_lpm_tree_create(mlxsw_sp, prefix_usage, lpm_tree = mlxsw_sp_lpm_tree_create(mlxsw_sp, prefix_usage,
proto, one_reserved); proto);
if (IS_ERR(lpm_tree)) if (IS_ERR(lpm_tree))
return lpm_tree; return lpm_tree;
...@@ -421,7 +417,7 @@ static struct mlxsw_sp_vr *mlxsw_sp_vr_create(struct mlxsw_sp *mlxsw_sp, ...@@ -421,7 +417,7 @@ static struct mlxsw_sp_vr *mlxsw_sp_vr_create(struct mlxsw_sp *mlxsw_sp,
mlxsw_sp_prefix_usage_zero(&req_prefix_usage); mlxsw_sp_prefix_usage_zero(&req_prefix_usage);
mlxsw_sp_prefix_usage_set(&req_prefix_usage, prefix_len); mlxsw_sp_prefix_usage_set(&req_prefix_usage, prefix_len);
lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage, lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage,
proto, true); proto);
if (IS_ERR(lpm_tree)) { if (IS_ERR(lpm_tree)) {
err = PTR_ERR(lpm_tree); err = PTR_ERR(lpm_tree);
goto err_tree_get; goto err_tree_get;
...@@ -463,7 +459,7 @@ mlxsw_sp_vr_lpm_tree_check(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_vr *vr, ...@@ -463,7 +459,7 @@ mlxsw_sp_vr_lpm_tree_check(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_vr *vr,
return 0; return 0;
new_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); vr->proto);
if (IS_ERR(new_tree)) { if (IS_ERR(new_tree)) {
/* We failed to get a tree according to the required /* We failed to get a tree according to the required
* prefix usage. However, the current tree might be still good * prefix usage. However, the current tree might be still good
......
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