]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: DR, Rework is_fw_table function
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Fri, 5 Aug 2022 10:42:24 +0000 (13:42 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 9 Dec 2022 00:10:54 +0000 (16:10 -0800)
This patch handles the following two changes w.r.t. is_fw_table function:

1. When SW steering is asked to create/destroy FW table, we allow for
creation/destruction of only termination tables. Rename mlx5_dr_is_fw_table
both to comply with the static function naming and to reflect that we're
actually checking for FW termination table.

2. When the action 'go to flow table' is created, the destination flow
table can be any FW table, not only termination table. Adding function
to check if the dest table is FW table. This function will also be used
by the later creation of range match action, so putting it the header file.

Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: Alex Vesker <valex@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c

index 772ee747511f0c30163cedc03f9e7b760103e596..804268b487d8601bc37332fcea0d3f21854ad9d2 100644 (file)
@@ -1492,4 +1492,10 @@ int mlx5dr_fw_create_md_tbl(struct mlx5dr_domain *dmn,
                            u32 flow_source);
 void mlx5dr_fw_destroy_md_tbl(struct mlx5dr_domain *dmn, u32 tbl_id,
                              u32 group_id);
+
+static inline bool mlx5dr_is_fw_table(struct mlx5_flow_table *ft)
+{
+       return !ft->fs_dr_table.dr_table;
+}
+
 #endif  /* _DR_TYPES_H_ */
index 13b6d4721e170e2f57055c364e94c7160e7f7b8f..c78fb016c2459d56d7ed50747ba873ad00bbd224 100644 (file)
@@ -7,10 +7,11 @@
 #include "fs_cmd.h"
 #include "mlx5dr.h"
 #include "fs_dr.h"
+#include "dr_types.h"
 
-static bool mlx5_dr_is_fw_table(u32 flags)
+static bool dr_is_fw_term_table(struct mlx5_flow_table *ft)
 {
-       if (flags & MLX5_FLOW_TABLE_TERMINATION)
+       if (ft->flags & MLX5_FLOW_TABLE_TERMINATION)
                return true;
 
        return false;
@@ -69,7 +70,7 @@ static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,
        u32 flags;
        int err;
 
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->create_flow_table(ns, ft,
                                                                    ft_attr,
                                                                    next_ft);
@@ -109,7 +110,7 @@ static int mlx5_cmd_dr_destroy_flow_table(struct mlx5_flow_root_namespace *ns,
        struct mlx5dr_action *action = ft->fs_dr_table.miss_action;
        int err;
 
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->destroy_flow_table(ns, ft);
 
        err = mlx5dr_table_destroy(ft->fs_dr_table.dr_table);
@@ -134,7 +135,7 @@ static int mlx5_cmd_dr_modify_flow_table(struct mlx5_flow_root_namespace *ns,
                                         struct mlx5_flow_table *ft,
                                         struct mlx5_flow_table *next_ft)
 {
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->modify_flow_table(ns, ft, next_ft);
 
        return set_miss_action(ns, ft, next_ft);
@@ -153,7 +154,7 @@ static int mlx5_cmd_dr_create_flow_group(struct mlx5_flow_root_namespace *ns,
                                            match_criteria_enable);
        struct mlx5dr_match_parameters mask;
 
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->create_flow_group(ns, ft, in,
                                                                    fg);
 
@@ -178,7 +179,7 @@ static int mlx5_cmd_dr_destroy_flow_group(struct mlx5_flow_root_namespace *ns,
                                          struct mlx5_flow_table *ft,
                                          struct mlx5_flow_group *fg)
 {
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->destroy_flow_group(ns, ft, fg);
 
        return mlx5dr_matcher_destroy(fg->fs_dr_matcher.dr_matcher);
@@ -209,7 +210,7 @@ static struct mlx5dr_action *create_ft_action(struct mlx5dr_domain *domain,
 {
        struct mlx5_flow_table *dest_ft = dst->dest_attr.ft;
 
-       if (mlx5_dr_is_fw_table(dest_ft->flags))
+       if (mlx5dr_is_fw_table(dest_ft))
                return mlx5dr_action_create_dest_flow_fw_table(domain, dest_ft);
        return mlx5dr_action_create_dest_table(dest_ft->fs_dr_table.dr_table);
 }
@@ -260,7 +261,7 @@ static int mlx5_cmd_dr_create_fte(struct mlx5_flow_root_namespace *ns,
        int err = 0;
        int i;
 
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->create_fte(ns, ft, group, fte);
 
        actions = kcalloc(MLX5_FLOW_CONTEXT_ACTION_MAX, sizeof(*actions),
@@ -702,7 +703,7 @@ static int mlx5_cmd_dr_delete_fte(struct mlx5_flow_root_namespace *ns,
        int err;
        int i;
 
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->delete_fte(ns, ft, fte);
 
        err = mlx5dr_rule_destroy(rule->dr_rule);
@@ -727,7 +728,7 @@ static int mlx5_cmd_dr_update_fte(struct mlx5_flow_root_namespace *ns,
        struct fs_fte fte_tmp = {};
        int ret;
 
-       if (mlx5_dr_is_fw_table(ft->flags))
+       if (dr_is_fw_term_table(ft))
                return mlx5_fs_cmd_get_fw_cmds()->update_fte(ns, ft, group, modify_mask, fte);
 
        /* Backup current dr rule details */