net/mlx5: Add new miss flow table action
authorMaor Gottlieb <maorg@mellanox.com>
Mon, 29 Apr 2019 18:14:14 +0000 (18:14 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Mon, 29 Apr 2019 23:55:05 +0000 (16:55 -0700)
Flow table supports three types of miss action:
1. Default miss action - go to default miss table according to table.
2. Go to specific table.
3. Switch domain - go to the root table of an alternative steering
   table domain.

New table miss action was added - switch_domain.
The next domain for RDMA_RX namespace is the NIC RX domain.

Signed-off-by: Maor Gottlieb <maorg@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
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
include/linux/mlx5/mlx5_ifc.h

index 629c5ab1c0d18f0c3905f337660dafe10fe6c3fb..013b1ca4a79126b27390c04444831cbfa8bcd6c1 100644 (file)
@@ -172,9 +172,14 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
        case FS_FT_OP_MOD_NORMAL:
                if (next_ft) {
                        MLX5_SET(create_flow_table_in, in,
-                                flow_table_context.table_miss_action, 1);
+                                flow_table_context.table_miss_action,
+                                MLX5_FLOW_TABLE_MISS_ACTION_FWD);
                        MLX5_SET(create_flow_table_in, in,
                                 flow_table_context.table_miss_id, next_ft->id);
+               } else {
+                       MLX5_SET(create_flow_table_in, in,
+                                flow_table_context.table_miss_action,
+                                ns->def_miss_action);
                }
                break;
 
@@ -246,13 +251,15 @@ static int mlx5_cmd_modify_flow_table(struct mlx5_flow_root_namespace *ns,
                         MLX5_MODIFY_FLOW_TABLE_MISS_TABLE_ID);
                if (next_ft) {
                        MLX5_SET(modify_flow_table_in, in,
-                                flow_table_context.table_miss_action, 1);
+                                flow_table_context.table_miss_action,
+                                MLX5_FLOW_TABLE_MISS_ACTION_FWD);
                        MLX5_SET(modify_flow_table_in, in,
                                 flow_table_context.table_miss_id,
                                 next_ft->id);
                } else {
                        MLX5_SET(modify_flow_table_in, in,
-                                flow_table_context.table_miss_action, 0);
+                                flow_table_context.table_miss_action,
+                                ns->def_miss_action);
                }
        }
 
index 3c2302a2b9d4e37a0caba18fab878ba35159cfdf..fb5b61727ee70845cf9a980c5805eaf19f174640 100644 (file)
@@ -2504,6 +2504,9 @@ static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
        if (!steering->rdma_rx_root_ns)
                return -ENOMEM;
 
+       steering->rdma_rx_root_ns->def_miss_action =
+               MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN;
+
        /* Create single prio */
        prio = fs_create_prio(&steering->rdma_rx_root_ns->ns, 0, 1);
        if (IS_ERR(prio)) {
@@ -2748,7 +2751,8 @@ int mlx5_init_fs(struct mlx5_core_dev *dev)
                        goto err;
        }
 
-       if (MLX5_CAP_FLOWTABLE_RDMA_RX(dev, ft_support)) {
+       if (MLX5_CAP_FLOWTABLE_RDMA_RX(dev, ft_support) &&
+           MLX5_CAP_FLOWTABLE_RDMA_RX(dev, table_miss_action_domain)) {
                err = init_rdma_rx_root_ns(steering);
                if (err)
                        goto err;
index e43c6f6d46a746aa471366c6b56b8c72011d37df..0c6c5fef4548d3afb62521017592f0439217265d 100644 (file)
@@ -218,6 +218,7 @@ struct mlx5_flow_root_namespace {
        struct mutex                    chain_lock;
        struct list_head                underlay_qpns;
        const struct mlx5_flow_cmds     *cmds;
+       enum mlx5_flow_table_miss_action def_miss_action;
 };
 
 int mlx5_init_fc_stats(struct mlx5_core_dev *dev);
index 89e7194b3d976e58153e615bb0213e7896f08747..7d9264b282d1b3aeeb1b4a12c6a1db246035cc95 100644 (file)
@@ -370,7 +370,9 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
        u8         reformat_l3_tunnel_to_l2[0x1];
        u8         reformat_l2_to_l3_tunnel[0x1];
        u8         reformat_and_modify_action[0x1];
-       u8         reserved_at_15[0xb];
+       u8         reserved_at_15[0x2];
+       u8         table_miss_action_domain[0x1];
+       u8         reserved_at_18[0x8];
        u8         reserved_at_20[0x2];
        u8         log_max_ft_size[0x6];
        u8         log_max_modify_header_context[0x8];
@@ -1284,6 +1286,12 @@ enum mlx5_flow_destination_type {
        MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM = 0x101,
 };
 
+enum mlx5_flow_table_miss_action {
+       MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+       MLX5_FLOW_TABLE_MISS_ACTION_FWD,
+       MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN,
+};
+
 struct mlx5_ifc_dest_format_struct_bits {
        u8         destination_type[0x8];
        u8         destination_id[0x18];