mlxsw: spectrum_router: Have mlxsw_sp_nexthop_counter_enable() return int
authorPetr Machata <petrm@nvidia.com>
Fri, 8 Mar 2024 12:59:48 +0000 (13:59 +0100)
committerJakub Kicinski <kuba@kernel.org>
Mon, 11 Mar 2024 21:14:07 +0000 (14:14 -0700)
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>
drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h

index 22e3dcb1d67ad127600c551ed01fca9e03ad7469..ca80af06465f31af4c2f319755392f97e7d54065 100644 (file)
@@ -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
index 9bb58fb0d1daa8d5ce1569fb4c6d83c191b87300..23b54a4040af02369a0e620d06d31ca04b201b92 100644 (file)
@@ -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);
 
index bc5894c405a67741e7c898f86ff08d17690c700c..0432c7cc6b07af64d6ffe25235bfd0f65812dc20 100644 (file)
@@ -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);