net/mlx5: Create bypass and loopback flow steering namespaces for RDMA RX
Use different namespaces for bypass and switchdev loopback because they have different priorities and default table miss action requirement: 1. bypass: with multiple priorities support, and MLX5_FLOW_TABLE_MISS_ACTION_DEF as the default table miss action; 2. switchdev loopback: with single priority support, and MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN as the default table miss action. Signed-off-by: Mark Zhang <markz@mellanox.com> Reviewed-by: Mark Bloch <markb@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>alistair/sunxi64-5.4-dsi
parent
f66ad830b1
commit
e6806e9a63
|
@ -182,6 +182,26 @@ static struct init_tree_node egress_root_fs = {
|
|||
}
|
||||
};
|
||||
|
||||
#define RDMA_RX_BYPASS_PRIO 0
|
||||
#define RDMA_RX_KERNEL_PRIO 1
|
||||
static struct init_tree_node rdma_rx_root_fs = {
|
||||
.type = FS_TYPE_NAMESPACE,
|
||||
.ar_size = 2,
|
||||
.children = (struct init_tree_node[]) {
|
||||
[RDMA_RX_BYPASS_PRIO] =
|
||||
ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS, 0,
|
||||
FS_CHAINING_CAPS,
|
||||
ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
|
||||
ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_REGULAR_PRIOS,
|
||||
BY_PASS_PRIO_NUM_LEVELS))),
|
||||
[RDMA_RX_KERNEL_PRIO] =
|
||||
ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS + 1, 0,
|
||||
FS_CHAINING_CAPS,
|
||||
ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN,
|
||||
ADD_MULTIPLE_PRIO(1, 1))),
|
||||
}
|
||||
};
|
||||
|
||||
enum fs_i_lock_class {
|
||||
FS_LOCK_GRANDPARENT,
|
||||
FS_LOCK_PARENT,
|
||||
|
@ -2067,16 +2087,18 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
|
|||
if (steering->sniffer_tx_root_ns)
|
||||
return &steering->sniffer_tx_root_ns->ns;
|
||||
return NULL;
|
||||
case MLX5_FLOW_NAMESPACE_RDMA_RX:
|
||||
if (steering->rdma_rx_root_ns)
|
||||
return &steering->rdma_rx_root_ns->ns;
|
||||
return NULL;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (type == MLX5_FLOW_NAMESPACE_EGRESS) {
|
||||
root_ns = steering->egress_root_ns;
|
||||
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX) {
|
||||
root_ns = steering->rdma_rx_root_ns;
|
||||
prio = RDMA_RX_BYPASS_PRIO;
|
||||
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL) {
|
||||
root_ns = steering->rdma_rx_root_ns;
|
||||
prio = RDMA_RX_KERNEL_PRIO;
|
||||
} else { /* Must be NIC RX */
|
||||
root_ns = steering->root_ns;
|
||||
prio = type;
|
||||
|
@ -2507,18 +2529,25 @@ static int init_sniffer_rx_root_ns(struct mlx5_flow_steering *steering)
|
|||
|
||||
static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
|
||||
{
|
||||
struct fs_prio *prio;
|
||||
int err;
|
||||
|
||||
steering->rdma_rx_root_ns = create_root_ns(steering, FS_FT_RDMA_RX);
|
||||
if (!steering->rdma_rx_root_ns)
|
||||
return -ENOMEM;
|
||||
|
||||
steering->rdma_rx_root_ns->ns.def_miss_action =
|
||||
MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN;
|
||||
err = init_root_tree(steering, &rdma_rx_root_fs,
|
||||
&steering->rdma_rx_root_ns->ns.node);
|
||||
if (err)
|
||||
goto out_err;
|
||||
|
||||
/* Create single prio */
|
||||
prio = fs_create_prio(&steering->rdma_rx_root_ns->ns, 0, 1);
|
||||
return PTR_ERR_OR_ZERO(prio);
|
||||
set_prio_attrs(steering->rdma_rx_root_ns);
|
||||
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
cleanup_root_ns(steering->rdma_rx_root_ns);
|
||||
steering->rdma_rx_root_ns = NULL;
|
||||
return err;
|
||||
}
|
||||
static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
|
||||
{
|
||||
|
|
|
@ -51,7 +51,7 @@ static int mlx5_rdma_enable_roce_steering(struct mlx5_core_dev *dev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_RDMA_RX);
|
||||
ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL);
|
||||
if (!ns) {
|
||||
mlx5_core_err(dev, "Failed to get RDMA RX namespace");
|
||||
err = -EOPNOTSUPP;
|
||||
|
|
|
@ -75,6 +75,7 @@ enum mlx5_flow_namespace_type {
|
|||
MLX5_FLOW_NAMESPACE_SNIFFER_TX,
|
||||
MLX5_FLOW_NAMESPACE_EGRESS,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_RX,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
Loading…
Reference in New Issue