Skip to content

Commit 15b103d

Browse files
PatrisiousHaddadrleon
authored andcommitted
net/mlx5: fs, add RDMA TRANSPORT steering domain support
Add RX and TX RDMA_TRANSPORT flow table namespace, and the ability to create flow tables in those namespaces. The RDMA_TRANSPORT RX and TX are per vport. Packets will traverse through RDMA_TRANSPORT_RX after RDMA_RX and through RDMA_TRANSPORT_TX before RDMA_TX, ensuring proper control and management. RDMA_TRANSPORT domains are managed by the vport group manager. Signed-off-by: Patrisious Haddad <phaddad@nvidia.com> Reviewed-by: Mark Bloch <mbloch@nvidia.com> Link: https://patch.msgid.link/a6b550d9859a197eafa804b9a8d76916ca481da9.1740574103.git.leon@kernel.org Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent ab7d228 commit 15b103d

7 files changed

Lines changed: 195 additions & 21 deletions

File tree

drivers/net/ethernet/mellanox/mlx5/core/esw/acl/helper.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ esw_acl_table_create(struct mlx5_eswitch *esw, struct mlx5_vport *vport, int ns,
2727
esw_debug(dev, "Create vport[%d] %s ACL table\n", vport_num,
2828
ns == MLX5_FLOW_NAMESPACE_ESW_INGRESS ? "ingress" : "egress");
2929

30-
root_ns = mlx5_get_flow_vport_acl_namespace(dev, ns, vport->index);
30+
root_ns = mlx5_get_flow_vport_namespace(dev, ns, vport->index);
3131
if (!root_ns) {
3232
esw_warn(dev, "Failed to get E-Switch root namespace for vport (%d)\n",
3333
vport_num);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2828,9 +2828,9 @@ static int esw_set_master_egress_rule(struct mlx5_core_dev *master,
28282828
if (IS_ERR(vport))
28292829
return PTR_ERR(vport);
28302830

2831-
egress_ns = mlx5_get_flow_vport_acl_namespace(master,
2832-
MLX5_FLOW_NAMESPACE_ESW_EGRESS,
2833-
vport->index);
2831+
egress_ns = mlx5_get_flow_vport_namespace(master,
2832+
MLX5_FLOW_NAMESPACE_ESW_EGRESS,
2833+
vport->index);
28342834
if (!egress_ns)
28352835
return -EINVAL;
28362836

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,8 @@ const struct mlx5_flow_cmds *mlx5_fs_cmd_get_default(enum fs_flow_table_type typ
11421142
case FS_FT_RDMA_RX:
11431143
case FS_FT_RDMA_TX:
11441144
case FS_FT_PORT_SEL:
1145+
case FS_FT_RDMA_TRANSPORT_RX:
1146+
case FS_FT_RDMA_TRANSPORT_TX:
11451147
return mlx5_fs_cmd_get_fw_cmds();
11461148
default:
11471149
return mlx5_fs_cmd_get_stub_cmds();

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

Lines changed: 166 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,7 +1456,7 @@ mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
14561456
struct mlx5_flow_table *ft;
14571457
int autogroups_max_fte;
14581458

1459-
ft = mlx5_create_flow_table(ns, ft_attr);
1459+
ft = mlx5_create_vport_flow_table(ns, ft_attr, ft_attr->vport);
14601460
if (IS_ERR(ft))
14611461
return ft;
14621462

@@ -2764,9 +2764,9 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
27642764
}
27652765
EXPORT_SYMBOL(mlx5_get_flow_namespace);
27662766

2767-
struct mlx5_flow_namespace *mlx5_get_flow_vport_acl_namespace(struct mlx5_core_dev *dev,
2768-
enum mlx5_flow_namespace_type type,
2769-
int vport)
2767+
struct mlx5_flow_namespace *
2768+
mlx5_get_flow_vport_namespace(struct mlx5_core_dev *dev,
2769+
enum mlx5_flow_namespace_type type, int vport_idx)
27702770
{
27712771
struct mlx5_flow_steering *steering = dev->priv.steering;
27722772

@@ -2775,25 +2775,43 @@ struct mlx5_flow_namespace *mlx5_get_flow_vport_acl_namespace(struct mlx5_core_d
27752775

27762776
switch (type) {
27772777
case MLX5_FLOW_NAMESPACE_ESW_EGRESS:
2778-
if (vport >= steering->esw_egress_acl_vports)
2778+
if (vport_idx >= steering->esw_egress_acl_vports)
27792779
return NULL;
27802780
if (steering->esw_egress_root_ns &&
2781-
steering->esw_egress_root_ns[vport])
2782-
return &steering->esw_egress_root_ns[vport]->ns;
2781+
steering->esw_egress_root_ns[vport_idx])
2782+
return &steering->esw_egress_root_ns[vport_idx]->ns;
27832783
else
27842784
return NULL;
27852785
case MLX5_FLOW_NAMESPACE_ESW_INGRESS:
2786-
if (vport >= steering->esw_ingress_acl_vports)
2786+
if (vport_idx >= steering->esw_ingress_acl_vports)
27872787
return NULL;
27882788
if (steering->esw_ingress_root_ns &&
2789-
steering->esw_ingress_root_ns[vport])
2790-
return &steering->esw_ingress_root_ns[vport]->ns;
2789+
steering->esw_ingress_root_ns[vport_idx])
2790+
return &steering->esw_ingress_root_ns[vport_idx]->ns;
2791+
else
2792+
return NULL;
2793+
case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX:
2794+
if (vport_idx >= steering->rdma_transport_rx_vports)
2795+
return NULL;
2796+
if (steering->rdma_transport_rx_root_ns &&
2797+
steering->rdma_transport_rx_root_ns[vport_idx])
2798+
return &steering->rdma_transport_rx_root_ns[vport_idx]->ns;
2799+
else
2800+
return NULL;
2801+
case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX:
2802+
if (vport_idx >= steering->rdma_transport_tx_vports)
2803+
return NULL;
2804+
2805+
if (steering->rdma_transport_tx_root_ns &&
2806+
steering->rdma_transport_tx_root_ns[vport_idx])
2807+
return &steering->rdma_transport_tx_root_ns[vport_idx]->ns;
27912808
else
27922809
return NULL;
27932810
default:
27942811
return NULL;
27952812
}
27962813
}
2814+
EXPORT_SYMBOL(mlx5_get_flow_vport_namespace);
27972815

27982816
static struct fs_prio *_fs_create_prio(struct mlx5_flow_namespace *ns,
27992817
unsigned int prio,
@@ -3199,6 +3217,127 @@ static int init_rdma_tx_root_ns(struct mlx5_flow_steering *steering)
31993217
return err;
32003218
}
32013219

3220+
static int
3221+
init_rdma_transport_rx_root_ns_one(struct mlx5_flow_steering *steering,
3222+
int vport_idx)
3223+
{
3224+
struct fs_prio *prio;
3225+
3226+
steering->rdma_transport_rx_root_ns[vport_idx] =
3227+
create_root_ns(steering, FS_FT_RDMA_TRANSPORT_RX);
3228+
if (!steering->rdma_transport_rx_root_ns[vport_idx])
3229+
return -ENOMEM;
3230+
3231+
/* create 1 prio*/
3232+
prio = fs_create_prio(&steering->rdma_transport_rx_root_ns[vport_idx]->ns,
3233+
MLX5_RDMA_TRANSPORT_BYPASS_PRIO, 1);
3234+
return PTR_ERR_OR_ZERO(prio);
3235+
}
3236+
3237+
static int
3238+
init_rdma_transport_tx_root_ns_one(struct mlx5_flow_steering *steering,
3239+
int vport_idx)
3240+
{
3241+
struct fs_prio *prio;
3242+
3243+
steering->rdma_transport_tx_root_ns[vport_idx] =
3244+
create_root_ns(steering, FS_FT_RDMA_TRANSPORT_TX);
3245+
if (!steering->rdma_transport_tx_root_ns[vport_idx])
3246+
return -ENOMEM;
3247+
3248+
/* create 1 prio*/
3249+
prio = fs_create_prio(&steering->rdma_transport_tx_root_ns[vport_idx]->ns,
3250+
MLX5_RDMA_TRANSPORT_BYPASS_PRIO, 1);
3251+
return PTR_ERR_OR_ZERO(prio);
3252+
}
3253+
3254+
static int init_rdma_transport_rx_root_ns(struct mlx5_flow_steering *steering)
3255+
{
3256+
struct mlx5_core_dev *dev = steering->dev;
3257+
int total_vports;
3258+
int err;
3259+
int i;
3260+
3261+
/* In case eswitch not supported and working in legacy mode */
3262+
total_vports = mlx5_eswitch_get_total_vports(dev) ?: 1;
3263+
3264+
steering->rdma_transport_rx_root_ns =
3265+
kcalloc(total_vports,
3266+
sizeof(*steering->rdma_transport_rx_root_ns),
3267+
GFP_KERNEL);
3268+
if (!steering->rdma_transport_rx_root_ns)
3269+
return -ENOMEM;
3270+
3271+
for (i = 0; i < total_vports; i++) {
3272+
err = init_rdma_transport_rx_root_ns_one(steering, i);
3273+
if (err)
3274+
goto cleanup_root_ns;
3275+
}
3276+
steering->rdma_transport_rx_vports = total_vports;
3277+
return 0;
3278+
3279+
cleanup_root_ns:
3280+
while (i--)
3281+
cleanup_root_ns(steering->rdma_transport_rx_root_ns[i]);
3282+
kfree(steering->rdma_transport_rx_root_ns);
3283+
steering->rdma_transport_rx_root_ns = NULL;
3284+
return err;
3285+
}
3286+
3287+
static int init_rdma_transport_tx_root_ns(struct mlx5_flow_steering *steering)
3288+
{
3289+
struct mlx5_core_dev *dev = steering->dev;
3290+
int total_vports;
3291+
int err;
3292+
int i;
3293+
3294+
/* In case eswitch not supported and working in legacy mode */
3295+
total_vports = mlx5_eswitch_get_total_vports(dev) ?: 1;
3296+
3297+
steering->rdma_transport_tx_root_ns =
3298+
kcalloc(total_vports,
3299+
sizeof(*steering->rdma_transport_tx_root_ns),
3300+
GFP_KERNEL);
3301+
if (!steering->rdma_transport_tx_root_ns)
3302+
return -ENOMEM;
3303+
3304+
for (i = 0; i < total_vports; i++) {
3305+
err = init_rdma_transport_tx_root_ns_one(steering, i);
3306+
if (err)
3307+
goto cleanup_root_ns;
3308+
}
3309+
steering->rdma_transport_tx_vports = total_vports;
3310+
return 0;
3311+
3312+
cleanup_root_ns:
3313+
while (i--)
3314+
cleanup_root_ns(steering->rdma_transport_tx_root_ns[i]);
3315+
kfree(steering->rdma_transport_tx_root_ns);
3316+
steering->rdma_transport_tx_root_ns = NULL;
3317+
return err;
3318+
}
3319+
3320+
static void cleanup_rdma_transport_roots_ns(struct mlx5_flow_steering *steering)
3321+
{
3322+
int i;
3323+
3324+
if (steering->rdma_transport_rx_root_ns) {
3325+
for (i = 0; i < steering->rdma_transport_rx_vports; i++)
3326+
cleanup_root_ns(steering->rdma_transport_rx_root_ns[i]);
3327+
3328+
kfree(steering->rdma_transport_rx_root_ns);
3329+
steering->rdma_transport_rx_root_ns = NULL;
3330+
}
3331+
3332+
if (steering->rdma_transport_tx_root_ns) {
3333+
for (i = 0; i < steering->rdma_transport_tx_vports; i++)
3334+
cleanup_root_ns(steering->rdma_transport_tx_root_ns[i]);
3335+
3336+
kfree(steering->rdma_transport_tx_root_ns);
3337+
steering->rdma_transport_tx_root_ns = NULL;
3338+
}
3339+
}
3340+
32023341
/* FT and tc chains are stored in the same array so we can re-use the
32033342
* mlx5_get_fdb_sub_ns() and tc api for FT chains.
32043343
* When creating a new ns for each chain store it in the first available slot.
@@ -3631,6 +3770,7 @@ void mlx5_fs_core_cleanup(struct mlx5_core_dev *dev)
36313770
cleanup_root_ns(steering->rdma_rx_root_ns);
36323771
cleanup_root_ns(steering->rdma_tx_root_ns);
36333772
cleanup_root_ns(steering->egress_root_ns);
3773+
cleanup_rdma_transport_roots_ns(steering);
36343774

36353775
devl_params_unregister(priv_to_devlink(dev), mlx5_fs_params,
36363776
ARRAY_SIZE(mlx5_fs_params));
@@ -3700,6 +3840,18 @@ int mlx5_fs_core_init(struct mlx5_core_dev *dev)
37003840
goto err;
37013841
}
37023842

3843+
if (MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_RX(dev, ft_support)) {
3844+
err = init_rdma_transport_rx_root_ns(steering);
3845+
if (err)
3846+
goto err;
3847+
}
3848+
3849+
if (MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_TX(dev, ft_support)) {
3850+
err = init_rdma_transport_tx_root_ns(steering);
3851+
if (err)
3852+
goto err;
3853+
}
3854+
37033855
return 0;
37043856

37053857
err:
@@ -3850,8 +4002,10 @@ mlx5_get_root_namespace(struct mlx5_core_dev *dev, enum mlx5_flow_namespace_type
38504002
struct mlx5_flow_namespace *ns;
38514003

38524004
if (ns_type == MLX5_FLOW_NAMESPACE_ESW_EGRESS ||
3853-
ns_type == MLX5_FLOW_NAMESPACE_ESW_INGRESS)
3854-
ns = mlx5_get_flow_vport_acl_namespace(dev, ns_type, 0);
4005+
ns_type == MLX5_FLOW_NAMESPACE_ESW_INGRESS ||
4006+
ns_type == MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX ||
4007+
ns_type == MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX)
4008+
ns = mlx5_get_flow_vport_namespace(dev, ns_type, 0);
38554009
else
38564010
ns = mlx5_get_flow_namespace(dev, ns_type);
38574011
if (!ns)

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ enum fs_flow_table_type {
115115
FS_FT_PORT_SEL = 0X9,
116116
FS_FT_FDB_RX = 0xa,
117117
FS_FT_FDB_TX = 0xb,
118-
FS_FT_MAX_TYPE = FS_FT_FDB_TX,
118+
FS_FT_RDMA_TRANSPORT_RX = 0xd,
119+
FS_FT_RDMA_TRANSPORT_TX = 0xe,
120+
FS_FT_MAX_TYPE = FS_FT_RDMA_TRANSPORT_TX,
119121
};
120122

121123
enum fs_flow_table_op_mod {
@@ -158,6 +160,10 @@ struct mlx5_flow_steering {
158160
struct mlx5_flow_root_namespace *port_sel_root_ns;
159161
int esw_egress_acl_vports;
160162
int esw_ingress_acl_vports;
163+
struct mlx5_flow_root_namespace **rdma_transport_rx_root_ns;
164+
struct mlx5_flow_root_namespace **rdma_transport_tx_root_ns;
165+
int rdma_transport_rx_vports;
166+
int rdma_transport_tx_vports;
161167
};
162168

163169
struct fs_node {
@@ -434,7 +440,9 @@ struct mlx5_flow_root_namespace *find_root(struct fs_node *node);
434440
(type == FS_FT_PORT_SEL) ? MLX5_CAP_FLOWTABLE_PORT_SELECTION(mdev, cap) : \
435441
(type == FS_FT_FDB_RX) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) : \
436442
(type == FS_FT_FDB_TX) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) : \
437-
(BUILD_BUG_ON_ZERO(FS_FT_FDB_TX != FS_FT_MAX_TYPE))\
443+
(type == FS_FT_RDMA_TRANSPORT_RX) ? MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_RX(mdev, cap) : \
444+
(type == FS_FT_RDMA_TRANSPORT_TX) ? MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_TX(mdev, cap) : \
445+
(BUILD_BUG_ON_ZERO(FS_FT_RDMA_TRANSPORT_TX != FS_FT_MAX_TYPE))\
438446
)
439447

440448
#endif

include/linux/mlx5/device.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,6 +1346,12 @@ enum mlx5_qcam_feature_groups {
13461346
#define MLX5_CAP_FLOWTABLE_RDMA_TX(mdev, cap) \
13471347
MLX5_CAP_FLOWTABLE(mdev, flow_table_properties_nic_transmit_rdma.cap)
13481348

1349+
#define MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_RX(mdev, cap) \
1350+
MLX5_CAP_ADV_RDMA(mdev, rdma_transport_rx_flow_table_properties.cap)
1351+
1352+
#define MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_TX(mdev, cap) \
1353+
MLX5_CAP_ADV_RDMA(mdev, rdma_transport_tx_flow_table_properties.cap)
1354+
13491355
#define MLX5_CAP_ESW_FLOWTABLE(mdev, cap) \
13501356
MLX5_GET(flow_table_eswitch_cap, \
13511357
mdev->caps.hca[MLX5_CAP_ESWITCH_FLOW_TABLE]->cur, cap)

include/linux/mlx5/fs.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
#define MLX5_SET_CFG(p, f, v) MLX5_SET(create_flow_group_in, p, f, v)
4242

43+
#define MLX5_RDMA_TRANSPORT_BYPASS_PRIO 0
4344
#define MLX5_FS_MAX_POOL_SIZE BIT(30)
4445

4546
enum mlx5_flow_destination_type {
@@ -110,6 +111,8 @@ enum mlx5_flow_namespace_type {
110111
MLX5_FLOW_NAMESPACE_RDMA_TX_IPSEC,
111112
MLX5_FLOW_NAMESPACE_RDMA_RX_MACSEC,
112113
MLX5_FLOW_NAMESPACE_RDMA_TX_MACSEC,
114+
MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX,
115+
MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX,
113116
};
114117

115118
enum {
@@ -194,16 +197,17 @@ struct mlx5_flow_namespace *
194197
mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
195198
enum mlx5_flow_namespace_type type);
196199
struct mlx5_flow_namespace *
197-
mlx5_get_flow_vport_acl_namespace(struct mlx5_core_dev *dev,
198-
enum mlx5_flow_namespace_type type,
199-
int vport);
200+
mlx5_get_flow_vport_namespace(struct mlx5_core_dev *dev,
201+
enum mlx5_flow_namespace_type type,
202+
int vport_idx);
200203

201204
struct mlx5_flow_table_attr {
202205
int prio;
203206
int max_fte;
204207
u32 level;
205208
u32 flags;
206209
u16 uid;
210+
u16 vport;
207211
struct mlx5_flow_table *next_ft;
208212

209213
struct {

0 commit comments

Comments
 (0)