]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net/mlx5: Add ignore level support fwd to table rules
authorPaul Blakey <paulb@mellanox.com>
Sun, 5 Jan 2020 13:15:54 +0000 (15:15 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 16 Jan 2020 23:48:58 +0000 (15:48 -0800)
If user sets ignore flow level flag on a rule, that rule can point to
a flow table of any level, including those with levels equal or less
than the level of the flow table it is added on.

This with unamanged tables will be used to create a FDB chain/prio
hierarchy much larger than currently supported level range.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
include/linux/mlx5/fs.h

index 3c816e81f8d9bab405cbeeb3901d40341cbdd60d..b25465d9e030f6fa8b9d6af60245dd82b0470389 100644 (file)
@@ -432,6 +432,9 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
        MLX5_SET(set_fte_in, in, table_type, ft->type);
        MLX5_SET(set_fte_in, in, table_id,   ft->id);
        MLX5_SET(set_fte_in, in, flow_index, fte->index);
+       MLX5_SET(set_fte_in, in, ignore_flow_level,
+                !!(fte->action.flags & FLOW_ACT_IGNORE_FLOW_LEVEL));
+
        if (ft->vport) {
                MLX5_SET(set_fte_in, in, vport_number, ft->vport);
                MLX5_SET(set_fte_in, in, other_vport, 1);
index 456d3739b166c4fe90384d6ed1baf1a5a87f8914..355a424f45061f415ca4cf68b3c821b086686c3e 100644 (file)
@@ -1536,18 +1536,30 @@ static bool counter_is_valid(u32 action)
 }
 
 static bool dest_is_valid(struct mlx5_flow_destination *dest,
-                         u32 action,
+                         struct mlx5_flow_act *flow_act,
                          struct mlx5_flow_table *ft)
 {
+       bool ignore_level = flow_act->flags & FLOW_ACT_IGNORE_FLOW_LEVEL;
+       u32 action = flow_act->action;
+
        if (dest && (dest->type == MLX5_FLOW_DESTINATION_TYPE_COUNTER))
                return counter_is_valid(action);
 
        if (!(action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST))
                return true;
 
+       if (ignore_level) {
+               if (ft->type != FS_FT_FDB)
+                       return false;
+
+               if (dest->type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE &&
+                   dest->ft->type != FS_FT_FDB)
+                       return false;
+       }
+
        if (!dest || ((dest->type ==
            MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE) &&
-           (dest->ft->level <= ft->level)))
+           (dest->ft->level <= ft->level && !ignore_level)))
                return false;
        return true;
 }
@@ -1777,7 +1789,7 @@ _mlx5_add_flow_rules(struct mlx5_flow_table *ft,
                return ERR_PTR(-EINVAL);
 
        for (i = 0; i < dest_num; i++) {
-               if (!dest_is_valid(&dest[i], flow_act->action, ft))
+               if (!dest_is_valid(&dest[i], flow_act, ft))
                        return ERR_PTR(-EINVAL);
        }
        nested_down_read_ref_node(&ft->node, FS_LOCK_GRANDPARENT);
index de2c838bae9075d970d9873779d0340d93980384..81f393fb7d9635a3e6b7fb3c7cea9a93d41ec80e 100644 (file)
@@ -196,6 +196,7 @@ struct mlx5_fs_vlan {
 
 enum {
        FLOW_ACT_NO_APPEND = BIT(0),
+       FLOW_ACT_IGNORE_FLOW_LEVEL = BIT(1),
 };
 
 struct mlx5_flow_act {