]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net/mlx5: fs, add dest table cache
authorMoshe Shemesh <moshe@nvidia.com>
Thu, 9 Jan 2025 16:05:39 +0000 (18:05 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 14 Jan 2025 03:21:08 +0000 (19:21 -0800)
Add cache of destination flow table HWS action per HWS table. For each
flow table created cache a destination action towards this table. The
cached action will be used on the downstream patch whenever a rule
requires such action.

Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20250109160546.1733647-9-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h

index 543a7b2f0dff5f7bbfc610d404bbd0ed0d611e35..7146cdd791fcf24fee8c04aa5820d8cbbb8bc222 100644 (file)
@@ -62,6 +62,7 @@ static int mlx5_fs_init_hws_actions_pool(struct mlx5_core_dev *dev,
        xa_init(&hws_pool->el2tol3tnl_pools);
        xa_init(&hws_pool->el2tol2tnl_pools);
        xa_init(&hws_pool->mh_pools);
+       xa_init(&hws_pool->table_dests);
        return 0;
 
 cleanup_insert_hdr:
@@ -87,6 +88,7 @@ static void mlx5_fs_cleanup_hws_actions_pool(struct mlx5_fs_hws_context *fs_ctx)
        struct mlx5_fs_pool *pool;
        unsigned long i;
 
+       xa_destroy(&hws_pool->table_dests);
        xa_for_each(&hws_pool->mh_pools, i, pool)
                mlx5_fs_destroy_mh_pool(pool, &hws_pool->mh_pools, i);
        xa_destroy(&hws_pool->mh_pools);
@@ -173,6 +175,50 @@ static int mlx5_fs_set_ft_default_miss(struct mlx5_flow_root_namespace *ns,
        return 0;
 }
 
+static int mlx5_fs_add_flow_table_dest_action(struct mlx5_flow_root_namespace *ns,
+                                             struct mlx5_flow_table *ft)
+{
+       u32 flags = MLX5HWS_ACTION_FLAG_HWS_FDB | MLX5HWS_ACTION_FLAG_SHARED;
+       struct mlx5_fs_hws_context *fs_ctx = &ns->fs_hws_context;
+       struct mlx5hws_action *dest_ft_action;
+       struct xarray *dests_xa;
+       int err;
+
+       dest_ft_action = mlx5hws_action_create_dest_table_num(fs_ctx->hws_ctx,
+                                                             ft->id, flags);
+       if (!dest_ft_action) {
+               mlx5_core_err(ns->dev, "Failed creating dest table action\n");
+               return -ENOMEM;
+       }
+
+       dests_xa = &fs_ctx->hws_pool.table_dests;
+       err = xa_insert(dests_xa, ft->id, dest_ft_action, GFP_KERNEL);
+       if (err)
+               mlx5hws_action_destroy(dest_ft_action);
+       return err;
+}
+
+static int mlx5_fs_del_flow_table_dest_action(struct mlx5_flow_root_namespace *ns,
+                                             struct mlx5_flow_table *ft)
+{
+       struct mlx5_fs_hws_context *fs_ctx = &ns->fs_hws_context;
+       struct mlx5hws_action *dest_ft_action;
+       struct xarray *dests_xa;
+       int err;
+
+       dests_xa = &fs_ctx->hws_pool.table_dests;
+       dest_ft_action = xa_erase(dests_xa, ft->id);
+       if (!dest_ft_action) {
+               mlx5_core_err(ns->dev, "Failed to erase dest ft action\n");
+               return -ENOENT;
+       }
+
+       err = mlx5hws_action_destroy(dest_ft_action);
+       if (err)
+               mlx5_core_err(ns->dev, "Failed to destroy dest ft action\n");
+       return err;
+}
+
 static int mlx5_cmd_hws_create_flow_table(struct mlx5_flow_root_namespace *ns,
                                          struct mlx5_flow_table *ft,
                                          struct mlx5_flow_table_attr *ft_attr,
@@ -183,9 +229,16 @@ static int mlx5_cmd_hws_create_flow_table(struct mlx5_flow_root_namespace *ns,
        struct mlx5hws_table *tbl;
        int err;
 
-       if (mlx5_fs_cmd_is_fw_term_table(ft))
-               return mlx5_fs_cmd_get_fw_cmds()->create_flow_table(ns, ft, ft_attr,
-                                                                   next_ft);
+       if (mlx5_fs_cmd_is_fw_term_table(ft)) {
+               err = mlx5_fs_cmd_get_fw_cmds()->create_flow_table(ns, ft, ft_attr,
+                                                                  next_ft);
+               if (err)
+                       return err;
+               err = mlx5_fs_add_flow_table_dest_action(ns, ft);
+               if (err)
+                       mlx5_fs_cmd_get_fw_cmds()->destroy_flow_table(ns, ft);
+               return err;
+       }
 
        if (ns->table_type != FS_FT_FDB) {
                mlx5_core_err(ns->dev, "Table type %d not supported for HWS\n",
@@ -212,8 +265,13 @@ static int mlx5_cmd_hws_create_flow_table(struct mlx5_flow_root_namespace *ns,
 
        ft->max_fte = INT_MAX;
 
+       err = mlx5_fs_add_flow_table_dest_action(ns, ft);
+       if (err)
+               goto clear_ft_miss;
        return 0;
 
+clear_ft_miss:
+       mlx5_fs_set_ft_default_miss(ns, ft, NULL);
 destroy_table:
        mlx5hws_table_destroy(tbl);
        ft->fs_hws_table.hws_table = NULL;
@@ -225,6 +283,10 @@ static int mlx5_cmd_hws_destroy_flow_table(struct mlx5_flow_root_namespace *ns,
 {
        int err;
 
+       err = mlx5_fs_del_flow_table_dest_action(ns, ft);
+       if (err)
+               mlx5_core_err(ns->dev, "Failed to remove dest action (%d)\n", err);
+
        if (mlx5_fs_cmd_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->destroy_flow_table(ns, ft);
 
index 1e53c015633838532a34ee3f8e3bc81896b15f9f..205d8d71e7d92df34309f393401d3d4032138d55 100644 (file)
@@ -19,6 +19,7 @@ struct mlx5_fs_hws_actions_pool {
        struct xarray el2tol3tnl_pools;
        struct xarray el2tol2tnl_pools;
        struct xarray mh_pools;
+       struct xarray table_dests;
 };
 
 struct mlx5_fs_hws_context {