Commit 8acb480e authored by Petr Machata's avatar Petr Machata Committed by Jakub Kicinski
Browse files

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: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Link: https://lore.kernel.org/r/e0bb5c0cc6234ade2ade1e92abac991359c3f446.1709901020.git.petrm@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 64f962c6
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -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
+17 −7
Original line number Diff line number Diff line
@@ -3151,20 +3151,23 @@ struct mlxsw_sp_nexthop_group {
	bool can_destroy;
};

void mlxsw_sp_nexthop_counter_enable(struct mlxsw_sp *mlxsw_sp,
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);

+2 −2
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ 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,
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);