Skip to content

Commit a7ee18b

Browse files
mark-blochjgunthorpe
authored andcommitted
RDMA/mlx5: Allow creating a matcher for a NIC TX flow table
Currently a matcher can only be created and attached to a NIC RX flow table. Extend it to allow it on NIC TX flow tables as well. In order to achieve that, we: 1) Expose a new attribute: MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS. enum ib_flow_flags is used as valid flags. Only IB_FLOW_ATTR_FLAGS_EGRESS is supported. 2) Remove the requirement to have a DEVX or QP destination when creating a flow. A flow added to NIC TX flow table will forward the packet outside of the vport (Wire or E-Switch in the SR-iOV case). Signed-off-by: Mark Bloch <markb@mellanox.com> Reviewed-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
1 parent b47fd4f commit a7ee18b

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

Diff for: drivers/infiniband/hw/mlx5/flow.c

+29-5
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,14 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
8686
dest_qp = uverbs_attr_is_valid(attrs,
8787
MLX5_IB_ATTR_CREATE_FLOW_DEST_QP);
8888

89-
if ((dest_devx && dest_qp) || (!dest_devx && !dest_qp))
89+
fs_matcher = uverbs_attr_get_obj(attrs,
90+
MLX5_IB_ATTR_CREATE_FLOW_MATCHER);
91+
if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_BYPASS &&
92+
((dest_devx && dest_qp) || (!dest_devx && !dest_qp)))
93+
return -EINVAL;
94+
95+
if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_EGRESS &&
96+
(dest_devx || dest_qp))
9097
return -EINVAL;
9198

9299
if (dest_devx) {
@@ -100,7 +107,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
100107
*/
101108
if (!mlx5_ib_devx_is_flow_dest(devx_obj, &dest_id, &dest_type))
102109
return -EINVAL;
103-
} else {
110+
} else if (dest_qp) {
104111
struct mlx5_ib_qp *mqp;
105112

106113
qp = uverbs_attr_get_obj(attrs,
@@ -117,6 +124,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
117124
else
118125
dest_id = mqp->raw_packet_qp.rq.tirn;
119126
dest_type = MLX5_FLOW_DESTINATION_TYPE_TIR;
127+
} else {
128+
dest_type = MLX5_FLOW_DESTINATION_TYPE_PORT;
120129
}
121130

122131
if (dev->rep)
@@ -126,8 +135,6 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
126135
attrs, MLX5_IB_ATTR_CREATE_FLOW_MATCH_VALUE);
127136
inlen = uverbs_attr_get_len(attrs,
128137
MLX5_IB_ATTR_CREATE_FLOW_MATCH_VALUE);
129-
fs_matcher = uverbs_attr_get_obj(attrs,
130-
MLX5_IB_ATTR_CREATE_FLOW_MATCHER);
131138

132139
uflow_res = flow_resources_alloc(MLX5_IB_CREATE_FLOW_MAX_FLOW_ACTIONS);
133140
if (!uflow_res)
@@ -183,6 +190,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
183190
attrs, MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE);
184191
struct mlx5_ib_dev *dev = to_mdev(uobj->context->device);
185192
struct mlx5_ib_flow_matcher *obj;
193+
u32 flags;
186194
int err;
187195

188196
obj = kzalloc(sizeof(struct mlx5_ib_flow_matcher), GFP_KERNEL);
@@ -215,6 +223,19 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
215223
if (err)
216224
goto end;
217225

226+
err = uverbs_get_flags32(&flags, attrs,
227+
MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS,
228+
IB_FLOW_ATTR_FLAGS_EGRESS);
229+
if (err)
230+
goto end;
231+
232+
if (flags) {
233+
err = mlx5_ib_ft_type_to_namespace(
234+
MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX, &obj->ns_type);
235+
if (err)
236+
goto end;
237+
}
238+
218239
uobj->object = obj;
219240
obj->mdev = dev->mdev;
220241
atomic_set(&obj->usecnt, 0);
@@ -559,7 +580,10 @@ DECLARE_UVERBS_NAMED_METHOD(
559580
UA_MANDATORY),
560581
UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_FLOW_MATCHER_MATCH_CRITERIA,
561582
UVERBS_ATTR_TYPE(u8),
562-
UA_MANDATORY));
583+
UA_MANDATORY),
584+
UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS,
585+
enum ib_flow_flags,
586+
UA_OPTIONAL));
563587

564588
DECLARE_UVERBS_NAMED_METHOD_DESTROY(
565589
MLX5_IB_METHOD_FLOW_MATCHER_DESTROY,

Diff for: drivers/infiniband/hw/mlx5/main.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -3892,10 +3892,13 @@ mlx5_ib_raw_fs_rule_add(struct mlx5_ib_dev *dev,
38923892
dst->type = dest_type;
38933893
dst->tir_num = dest_id;
38943894
flow_act->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
3895-
} else {
3895+
} else if (dest_type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE) {
38963896
dst->type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM;
38973897
dst->ft_num = dest_id;
38983898
flow_act->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
3899+
} else {
3900+
dst->type = MLX5_FLOW_DESTINATION_TYPE_PORT;
3901+
flow_act->action |= MLX5_FLOW_CONTEXT_ACTION_ALLOW;
38993902
}
39003903

39013904
handler = _create_raw_flow_rule(dev, ft_prio, dst, fs_matcher, flow_act,

Diff for: include/uapi/rdma/mlx5_user_ioctl_cmds.h

+1
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ enum mlx5_ib_flow_matcher_create_attrs {
125125
MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK,
126126
MLX5_IB_ATTR_FLOW_MATCHER_FLOW_TYPE,
127127
MLX5_IB_ATTR_FLOW_MATCHER_MATCH_CRITERIA,
128+
MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS,
128129
};
129130

130131
enum mlx5_ib_flow_matcher_destroy_attrs {

0 commit comments

Comments
 (0)