Skip to content

Commit 52438be

Browse files
mark-blochjgunthorpe
authored andcommitted
RDMA/mlx5: Allow inserting a steering rule to the FDB
Allow this only via mlx5 raw create flow API, legacy verbs are not supported. To accommodate that, we add a new attribute to matcher creation to indicate the type of flow table to be used. MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE With this new attribute MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS is no longer needed, we keep it for compatibility but at most only a single attribute can be passed of the two. When inserting a flow rule to the FDB we require that a DEVX FT is provided as a destination, no other configuration is allowed. Signed-off-by: Mark Bloch <[email protected]> Reviewed-by: Maor Gottlieb <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 3b70508 commit 52438be

File tree

3 files changed

+65
-12
lines changed

3 files changed

+65
-12
lines changed

drivers/infiniband/hw/mlx5/flow.c

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ mlx5_ib_ft_type_to_namespace(enum mlx5_ib_uapi_flow_table_type table_type,
2929
case MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX:
3030
*namespace = MLX5_FLOW_NAMESPACE_EGRESS;
3131
break;
32+
case MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB:
33+
*namespace = MLX5_FLOW_NAMESPACE_FDB;
34+
break;
3235
default:
3336
return -EINVAL;
3437
}
@@ -93,6 +96,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
9396
((dest_devx && dest_qp) || (!dest_devx && !dest_qp)))
9497
return -EINVAL;
9598

99+
/* Allow only DEVX object as dest when inserting to FDB */
100+
if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB && !dest_devx)
101+
return -EINVAL;
102+
96103
if (dest_devx) {
97104
devx_obj = uverbs_attr_get_obj(
98105
attrs, MLX5_IB_ATTR_CREATE_FLOW_DEST_DEVX);
@@ -104,6 +111,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
104111
*/
105112
if (!mlx5_ib_devx_is_flow_dest(devx_obj, &dest_id, &dest_type))
106113
return -EINVAL;
114+
/* Allow only flow table as dest when inserting to FDB */
115+
if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB &&
116+
dest_type != MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE)
117+
return -EINVAL;
107118
} else if (dest_qp) {
108119
struct mlx5_ib_qp *mqp;
109120

@@ -203,21 +214,67 @@ static int flow_matcher_cleanup(struct ib_uobject *uobject,
203214
return 0;
204215
}
205216

217+
static int mlx5_ib_matcher_ns(struct uverbs_attr_bundle *attrs,
218+
struct mlx5_ib_flow_matcher *obj)
219+
{
220+
enum mlx5_ib_uapi_flow_table_type ft_type =
221+
MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX;
222+
u32 flags;
223+
int err;
224+
225+
/* New users should use MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE and older
226+
* users should switch to it. We leave this to not break userspace
227+
*/
228+
if (uverbs_attr_is_valid(attrs, MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE) &&
229+
uverbs_attr_is_valid(attrs, MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS))
230+
return -EINVAL;
231+
232+
if (uverbs_attr_is_valid(attrs, MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE)) {
233+
err = uverbs_get_const(&ft_type, attrs,
234+
MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE);
235+
if (err)
236+
return err;
237+
238+
err = mlx5_ib_ft_type_to_namespace(ft_type, &obj->ns_type);
239+
if (err)
240+
return err;
241+
242+
return 0;
243+
}
244+
245+
if (uverbs_attr_is_valid(attrs, MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS)) {
246+
err = uverbs_get_flags32(&flags, attrs,
247+
MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS,
248+
IB_FLOW_ATTR_FLAGS_EGRESS);
249+
if (err)
250+
return err;
251+
252+
if (flags) {
253+
mlx5_ib_ft_type_to_namespace(
254+
MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX,
255+
&obj->ns_type);
256+
return 0;
257+
}
258+
}
259+
260+
obj->ns_type = MLX5_FLOW_NAMESPACE_BYPASS;
261+
262+
return 0;
263+
}
264+
206265
static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
207266
struct uverbs_attr_bundle *attrs)
208267
{
209268
struct ib_uobject *uobj = uverbs_attr_get_uobject(
210269
attrs, MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE);
211270
struct mlx5_ib_dev *dev = mlx5_udata_to_mdev(&attrs->driver_udata);
212271
struct mlx5_ib_flow_matcher *obj;
213-
u32 flags;
214272
int err;
215273

216274
obj = kzalloc(sizeof(struct mlx5_ib_flow_matcher), GFP_KERNEL);
217275
if (!obj)
218276
return -ENOMEM;
219277

220-
obj->ns_type = MLX5_FLOW_NAMESPACE_BYPASS;
221278
obj->mask_len = uverbs_attr_get_len(
222279
attrs, MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK);
223280
err = uverbs_copy_from(&obj->matcher_mask,
@@ -243,19 +300,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
243300
if (err)
244301
goto end;
245302

246-
err = uverbs_get_flags32(&flags, attrs,
247-
MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS,
248-
IB_FLOW_ATTR_FLAGS_EGRESS);
303+
err = mlx5_ib_matcher_ns(attrs, obj);
249304
if (err)
250305
goto end;
251306

252-
if (flags) {
253-
err = mlx5_ib_ft_type_to_namespace(
254-
MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX, &obj->ns_type);
255-
if (err)
256-
goto end;
257-
}
258-
259307
uobj->object = obj;
260308
obj->mdev = dev->mdev;
261309
atomic_set(&obj->usecnt, 0);
@@ -605,6 +653,9 @@ DECLARE_UVERBS_NAMED_METHOD(
605653
UA_MANDATORY),
606654
UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS,
607655
enum ib_flow_flags,
656+
UA_OPTIONAL),
657+
UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE,
658+
enum mlx5_ib_uapi_flow_table_type,
608659
UA_OPTIONAL));
609660

610661
DECLARE_UVERBS_NAMED_METHOD_DESTROY(

include/uapi/rdma/mlx5_user_ioctl_cmds.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ enum mlx5_ib_flow_matcher_create_attrs {
144144
MLX5_IB_ATTR_FLOW_MATCHER_FLOW_TYPE,
145145
MLX5_IB_ATTR_FLOW_MATCHER_MATCH_CRITERIA,
146146
MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS,
147+
MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE,
147148
};
148149

149150
enum mlx5_ib_flow_matcher_destroy_attrs {

include/uapi/rdma/mlx5_user_ioctl_verbs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ enum mlx5_ib_uapi_flow_action_flags {
4242
enum mlx5_ib_uapi_flow_table_type {
4343
MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX = 0x0,
4444
MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX = 0x1,
45+
MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB = 0x2,
4546
};
4647

4748
enum mlx5_ib_uapi_flow_action_packet_reformat_type {

0 commit comments

Comments
 (0)