net/mlx5: fs, do proper bookkeeping for forward destinations
authorMark Bloch <mbloch@nvidia.com>
Tue, 15 Mar 2022 11:22:17 +0000 (11:22 +0000)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 3 May 2022 04:21:14 +0000 (21:21 -0700)
Keep track after destinations that are forward destinations.
When a forward destinations is removed from an FTE check if
the actions bits need to be updated.

Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Maor Gottlieb <maorg@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h

index f9d6ddd865e0c59d91df8e3dc8ec0392e6b31ca0..ec91727eee2a43c50ac18ad87cf9c591418aa98c 100644 (file)
@@ -424,6 +424,16 @@ static bool is_fwd_next_action(u32 action)
                         MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS);
 }
 
+static bool is_fwd_dest_type(enum mlx5_flow_destination_type type)
+{
+       return type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM ||
+               type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE ||
+               type == MLX5_FLOW_DESTINATION_TYPE_UPLINK ||
+               type == MLX5_FLOW_DESTINATION_TYPE_VPORT ||
+               type == MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER ||
+               type == MLX5_FLOW_DESTINATION_TYPE_TIR;
+}
+
 static bool check_valid_spec(const struct mlx5_flow_spec *spec)
 {
        int i;
@@ -566,8 +576,13 @@ static void del_sw_hw_rule(struct fs_node *node)
                goto out;
        }
 
-       if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
+       if (is_fwd_dest_type(rule->dest_attr.type)) {
                --fte->dests_size;
+               --fte->fwd_dests;
+
+               if (!fte->fwd_dests)
+                       fte->action.action &=
+                               ~MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
                fte->modify_mask |=
                        BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST);
                goto out;
@@ -1367,6 +1382,9 @@ create_flow_handle(struct fs_fte *fte,
                if (dest) {
                        fte->dests_size++;
 
+                       if (is_fwd_dest_type(dest[i].type))
+                               fte->fwd_dests++;
+
                        type = dest[i].type ==
                                MLX5_FLOW_DESTINATION_TYPE_COUNTER;
                        *modify_mask |= type ? count : dst;
index c488a7c5b07e9f6e7ea3570061397ec50fe9250f..67cad7a6d83682c87aa38e1df8cf55ac8bcbcdc4 100644 (file)
@@ -226,6 +226,7 @@ struct fs_fte {
        struct mlx5_fs_dr_rule          fs_dr_rule;
        u32                             val[MLX5_ST_SZ_DW_MATCH_PARAM];
        u32                             dests_size;
+       u32                             fwd_dests;
        u32                             index;
        struct mlx5_flow_context        flow_context;
        struct mlx5_flow_act            action;