Skip to content

Commit e6806e9

Browse files
Mark ZhangLeon Romanovsky
authored andcommitted
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 <[email protected]> Reviewed-by: Mark Bloch <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]>
1 parent f66ad83 commit e6806e9

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,26 @@ static struct init_tree_node egress_root_fs = {
182182
}
183183
};
184184

185+
#define RDMA_RX_BYPASS_PRIO 0
186+
#define RDMA_RX_KERNEL_PRIO 1
187+
static struct init_tree_node rdma_rx_root_fs = {
188+
.type = FS_TYPE_NAMESPACE,
189+
.ar_size = 2,
190+
.children = (struct init_tree_node[]) {
191+
[RDMA_RX_BYPASS_PRIO] =
192+
ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS, 0,
193+
FS_CHAINING_CAPS,
194+
ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
195+
ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_REGULAR_PRIOS,
196+
BY_PASS_PRIO_NUM_LEVELS))),
197+
[RDMA_RX_KERNEL_PRIO] =
198+
ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS + 1, 0,
199+
FS_CHAINING_CAPS,
200+
ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN,
201+
ADD_MULTIPLE_PRIO(1, 1))),
202+
}
203+
};
204+
185205
enum fs_i_lock_class {
186206
FS_LOCK_GRANDPARENT,
187207
FS_LOCK_PARENT,
@@ -2067,16 +2087,18 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
20672087
if (steering->sniffer_tx_root_ns)
20682088
return &steering->sniffer_tx_root_ns->ns;
20692089
return NULL;
2070-
case MLX5_FLOW_NAMESPACE_RDMA_RX:
2071-
if (steering->rdma_rx_root_ns)
2072-
return &steering->rdma_rx_root_ns->ns;
2073-
return NULL;
20742090
default:
20752091
break;
20762092
}
20772093

20782094
if (type == MLX5_FLOW_NAMESPACE_EGRESS) {
20792095
root_ns = steering->egress_root_ns;
2096+
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX) {
2097+
root_ns = steering->rdma_rx_root_ns;
2098+
prio = RDMA_RX_BYPASS_PRIO;
2099+
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL) {
2100+
root_ns = steering->rdma_rx_root_ns;
2101+
prio = RDMA_RX_KERNEL_PRIO;
20802102
} else { /* Must be NIC RX */
20812103
root_ns = steering->root_ns;
20822104
prio = type;
@@ -2507,18 +2529,25 @@ static int init_sniffer_rx_root_ns(struct mlx5_flow_steering *steering)
25072529

25082530
static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
25092531
{
2510-
struct fs_prio *prio;
2532+
int err;
25112533

25122534
steering->rdma_rx_root_ns = create_root_ns(steering, FS_FT_RDMA_RX);
25132535
if (!steering->rdma_rx_root_ns)
25142536
return -ENOMEM;
25152537

2516-
steering->rdma_rx_root_ns->ns.def_miss_action =
2517-
MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN;
2538+
err = init_root_tree(steering, &rdma_rx_root_fs,
2539+
&steering->rdma_rx_root_ns->ns.node);
2540+
if (err)
2541+
goto out_err;
25182542

2519-
/* Create single prio */
2520-
prio = fs_create_prio(&steering->rdma_rx_root_ns->ns, 0, 1);
2521-
return PTR_ERR_OR_ZERO(prio);
2543+
set_prio_attrs(steering->rdma_rx_root_ns);
2544+
2545+
return 0;
2546+
2547+
out_err:
2548+
cleanup_root_ns(steering->rdma_rx_root_ns);
2549+
steering->rdma_rx_root_ns = NULL;
2550+
return err;
25222551
}
25232552
static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
25242553
{

drivers/net/ethernet/mellanox/mlx5/core/rdma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static int mlx5_rdma_enable_roce_steering(struct mlx5_core_dev *dev)
5151
return -ENOMEM;
5252
}
5353

54-
ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_RDMA_RX);
54+
ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL);
5555
if (!ns) {
5656
mlx5_core_err(dev, "Failed to get RDMA RX namespace");
5757
err = -EOPNOTSUPP;

include/linux/mlx5/fs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ enum mlx5_flow_namespace_type {
7575
MLX5_FLOW_NAMESPACE_SNIFFER_TX,
7676
MLX5_FLOW_NAMESPACE_EGRESS,
7777
MLX5_FLOW_NAMESPACE_RDMA_RX,
78+
MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL,
7879
};
7980

8081
enum {

0 commit comments

Comments
 (0)