mlxsw: spectrum_router: Have mlxsw_sp_nexthop_counter_enable() return int
In order to be able to diagnose failures in counter allocation, have the function mlxsw_sp_nexthop_counter_enable() return an error code. Signed-off-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Link: https://lore.kernel.org/r/e0bb5c0cc6234ade2ade1e92abac991359c3f446.1709901020.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
64f962c65f
commit
8acb480e43
3 changed files with 36 additions and 12 deletions
|
@ -1181,9 +1181,11 @@ static int mlxsw_sp_dpipe_table_adj_counters_update(void *priv, bool enable)
|
|||
char ratr_pl[MLXSW_REG_RATR_LEN];
|
||||
struct mlxsw_sp *mlxsw_sp = priv;
|
||||
struct mlxsw_sp_nexthop *nh;
|
||||
unsigned int n_done = 0;
|
||||
u32 adj_hash_index = 0;
|
||||
u32 adj_index = 0;
|
||||
u32 adj_size = 0;
|
||||
int err;
|
||||
|
||||
mlxsw_sp_nexthop_for_each(nh, mlxsw_sp->router) {
|
||||
if (!mlxsw_sp_nexthop_is_forward(nh) ||
|
||||
|
@ -1192,15 +1194,27 @@ static int mlxsw_sp_dpipe_table_adj_counters_update(void *priv, bool enable)
|
|||
|
||||
mlxsw_sp_nexthop_indexes(nh, &adj_index, &adj_size,
|
||||
&adj_hash_index);
|
||||
if (enable)
|
||||
mlxsw_sp_nexthop_counter_enable(mlxsw_sp, nh);
|
||||
else
|
||||
if (enable) {
|
||||
err = mlxsw_sp_nexthop_counter_enable(mlxsw_sp, nh);
|
||||
if (err)
|
||||
goto err_counter_enable;
|
||||
} else {
|
||||
mlxsw_sp_nexthop_counter_disable(mlxsw_sp, nh);
|
||||
}
|
||||
mlxsw_sp_nexthop_eth_update(mlxsw_sp,
|
||||
adj_index + adj_hash_index, nh,
|
||||
true, ratr_pl);
|
||||
n_done++;
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_counter_enable:
|
||||
mlxsw_sp_nexthop_for_each(nh, mlxsw_sp->router) {
|
||||
if (!n_done--)
|
||||
break;
|
||||
mlxsw_sp_nexthop_counter_disable(mlxsw_sp, nh);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static u64
|
||||
|
|
|
@ -3151,20 +3151,23 @@ struct mlxsw_sp_nexthop_group {
|
|||
bool can_destroy;
|
||||
};
|
||||
|
||||
void mlxsw_sp_nexthop_counter_enable(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop *nh)
|
||||
int mlxsw_sp_nexthop_counter_enable(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop *nh)
|
||||
{
|
||||
struct devlink *devlink;
|
||||
int err;
|
||||
|
||||
devlink = priv_to_devlink(mlxsw_sp->core);
|
||||
if (!devlink_dpipe_table_counter_enabled(devlink,
|
||||
MLXSW_SP_DPIPE_TABLE_NAME_ADJ))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (mlxsw_sp_flow_counter_alloc(mlxsw_sp, &nh->counter_index))
|
||||
return;
|
||||
err = mlxsw_sp_flow_counter_alloc(mlxsw_sp, &nh->counter_index);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
nh->counter_valid = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mlxsw_sp_nexthop_counter_disable(struct mlxsw_sp *mlxsw_sp,
|
||||
|
@ -4507,7 +4510,10 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
mlxsw_sp_nexthop_counter_enable(mlxsw_sp, nh);
|
||||
err = mlxsw_sp_nexthop_counter_enable(mlxsw_sp, nh);
|
||||
if (err)
|
||||
goto err_counter_enable;
|
||||
|
||||
list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);
|
||||
|
||||
if (!dev)
|
||||
|
@ -4532,6 +4538,7 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,
|
|||
err_nexthop_neigh_init:
|
||||
list_del(&nh->router_list_node);
|
||||
mlxsw_sp_nexthop_counter_disable(mlxsw_sp, nh);
|
||||
err_counter_enable:
|
||||
mlxsw_sp_nexthop_remove(mlxsw_sp, nh);
|
||||
return err;
|
||||
}
|
||||
|
@ -6734,7 +6741,10 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
|
|||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
nh->neigh_tbl = &nd_tbl;
|
||||
#endif
|
||||
mlxsw_sp_nexthop_counter_enable(mlxsw_sp, nh);
|
||||
|
||||
err = mlxsw_sp_nexthop_counter_enable(mlxsw_sp, nh);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);
|
||||
|
||||
|
|
|
@ -156,8 +156,8 @@ int mlxsw_sp_nexthop_counter_get(struct mlxsw_sp *mlxsw_sp,
|
|||
int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
struct mlxsw_sp_nexthop *nh, bool force,
|
||||
char *ratr_pl);
|
||||
void mlxsw_sp_nexthop_counter_enable(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop *nh);
|
||||
int mlxsw_sp_nexthop_counter_enable(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop *nh);
|
||||
void mlxsw_sp_nexthop_counter_disable(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop *nh);
|
||||
|
||||
|
|
Loading…
Reference in a new issue