Skip to content

Commit 34613eb

Browse files
yishaihdledford
authored andcommitted
IB/mlx5: Enable modify and query verbs objects via DEVX
Enables modify and query verbs objects via the DEVX interface. To support this the above DEVX handlers were changed to get any object type via the UVERBS_IDR_ANY_OBJECT mechanism. The type checking and handling is done per object as part of the driver code. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
1 parent 04ca16c commit 34613eb

File tree

1 file changed

+96
-12
lines changed
  • drivers/infiniband/hw/mlx5

1 file changed

+96
-12
lines changed

drivers/infiniband/hw/mlx5/devx.c

Lines changed: 96 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <rdma/uverbs_ioctl.h>
1010
#include <rdma/mlx5_user_ioctl_cmds.h>
1111
#include <rdma/ib_umem.h>
12+
#include <rdma/uverbs_std_types.h>
1213
#include <linux/mlx5/driver.h>
1314
#include <linux/mlx5/fs.h>
1415
#include "mlx5_ib.h"
@@ -132,7 +133,7 @@ static u64 get_enc_obj_id(u16 opcode, u32 obj_id)
132133
return ((u64)opcode << 32) | obj_id;
133134
}
134135

135-
static int devx_is_valid_obj_id(struct devx_obj *obj, const void *in)
136+
static u64 devx_get_obj_id(const void *in)
136137
{
137138
u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
138139
u64 obj_id;
@@ -336,13 +337,96 @@ static int devx_is_valid_obj_id(struct devx_obj *obj, const void *in)
336337
MLX5_GET(arm_xrq_in, in, xrqn));
337338
break;
338339
default:
340+
obj_id = 0;
341+
}
342+
343+
return obj_id;
344+
}
345+
346+
static bool devx_is_valid_obj_id(struct ib_uobject *uobj, const void *in)
347+
{
348+
u64 obj_id = devx_get_obj_id(in);
349+
350+
if (!obj_id)
339351
return false;
352+
353+
switch (uobj_get_object_id(uobj)) {
354+
case UVERBS_OBJECT_CQ:
355+
return get_enc_obj_id(MLX5_CMD_OP_CREATE_CQ,
356+
to_mcq(uobj->object)->mcq.cqn) ==
357+
obj_id;
358+
359+
case UVERBS_OBJECT_SRQ:
360+
{
361+
struct mlx5_core_srq *srq = &(to_msrq(uobj->object)->msrq);
362+
struct mlx5_ib_dev *dev = to_mdev(uobj->context->device);
363+
u16 opcode;
364+
365+
switch (srq->common.res) {
366+
case MLX5_RES_XSRQ:
367+
opcode = MLX5_CMD_OP_CREATE_XRC_SRQ;
368+
break;
369+
case MLX5_RES_XRQ:
370+
opcode = MLX5_CMD_OP_CREATE_XRQ;
371+
break;
372+
default:
373+
if (!dev->mdev->issi)
374+
opcode = MLX5_CMD_OP_CREATE_SRQ;
375+
else
376+
opcode = MLX5_CMD_OP_CREATE_RMP;
377+
}
378+
379+
return get_enc_obj_id(opcode,
380+
to_msrq(uobj->object)->msrq.srqn) ==
381+
obj_id;
340382
}
341383

342-
if (obj_id == obj->obj_id)
343-
return true;
384+
case UVERBS_OBJECT_QP:
385+
{
386+
struct mlx5_ib_qp *qp = to_mqp(uobj->object);
387+
enum ib_qp_type qp_type = qp->ibqp.qp_type;
388+
389+
if (qp_type == IB_QPT_RAW_PACKET ||
390+
(qp->flags & MLX5_IB_QP_UNDERLAY)) {
391+
struct mlx5_ib_raw_packet_qp *raw_packet_qp =
392+
&qp->raw_packet_qp;
393+
struct mlx5_ib_rq *rq = &raw_packet_qp->rq;
394+
struct mlx5_ib_sq *sq = &raw_packet_qp->sq;
395+
396+
return (get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,
397+
rq->base.mqp.qpn) == obj_id ||
398+
get_enc_obj_id(MLX5_CMD_OP_CREATE_SQ,
399+
sq->base.mqp.qpn) == obj_id ||
400+
get_enc_obj_id(MLX5_CMD_OP_CREATE_TIR,
401+
rq->tirn) == obj_id ||
402+
get_enc_obj_id(MLX5_CMD_OP_CREATE_TIS,
403+
sq->tisn) == obj_id);
404+
}
405+
406+
if (qp_type == MLX5_IB_QPT_DCT)
407+
return get_enc_obj_id(MLX5_CMD_OP_CREATE_DCT,
408+
qp->dct.mdct.mqp.qpn) == obj_id;
409+
410+
return get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
411+
qp->ibqp.qp_num) == obj_id;
412+
}
344413

345-
return false;
414+
case UVERBS_OBJECT_WQ:
415+
return get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,
416+
to_mrwq(uobj->object)->core_qp.qpn) ==
417+
obj_id;
418+
419+
case UVERBS_OBJECT_RWQ_IND_TBL:
420+
return get_enc_obj_id(MLX5_CMD_OP_CREATE_RQT,
421+
to_mrwq_ind_table(uobj->object)->rqtn) ==
422+
obj_id;
423+
424+
case MLX5_IB_OBJECT_DEVX_OBJ:
425+
return ((struct devx_obj *)uobj->object)->obj_id == obj_id;
426+
427+
default:
428+
return false;
429+
}
346430
}
347431

348432
static void devx_set_umem_valid(const void *in)
@@ -994,7 +1078,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
9941078
struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
9951079
MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE);
9961080
struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
997-
struct devx_obj *obj = uobj->object;
1081+
struct mlx5_ib_dev *mdev = to_mdev(uobj->context->device);
9981082
void *cmd_out;
9991083
int err;
10001084
int uid;
@@ -1006,7 +1090,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
10061090
if (!devx_is_obj_modify_cmd(cmd_in))
10071091
return -EINVAL;
10081092

1009-
if (!devx_is_valid_obj_id(obj, cmd_in))
1093+
if (!devx_is_valid_obj_id(uobj, cmd_in))
10101094
return -EINVAL;
10111095

10121096
cmd_out = uverbs_zalloc(attrs, cmd_out_len);
@@ -1016,7 +1100,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
10161100
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
10171101
devx_set_umem_valid(cmd_in);
10181102

1019-
err = mlx5_cmd_exec(obj->mdev, cmd_in,
1103+
err = mlx5_cmd_exec(mdev->mdev, cmd_in,
10201104
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
10211105
cmd_out, cmd_out_len);
10221106
if (err)
@@ -1035,10 +1119,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
10351119
struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
10361120
MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE);
10371121
struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
1038-
struct devx_obj *obj = uobj->object;
10391122
void *cmd_out;
10401123
int err;
10411124
int uid;
1125+
struct mlx5_ib_dev *mdev = to_mdev(uobj->context->device);
10421126

10431127
uid = devx_get_uid(c, cmd_in);
10441128
if (uid < 0)
@@ -1047,15 +1131,15 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
10471131
if (!devx_is_obj_query_cmd(cmd_in))
10481132
return -EINVAL;
10491133

1050-
if (!devx_is_valid_obj_id(obj, cmd_in))
1134+
if (!devx_is_valid_obj_id(uobj, cmd_in))
10511135
return -EINVAL;
10521136

10531137
cmd_out = uverbs_zalloc(attrs, cmd_out_len);
10541138
if (IS_ERR(cmd_out))
10551139
return PTR_ERR(cmd_out);
10561140

10571141
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
1058-
err = mlx5_cmd_exec(obj->mdev, cmd_in,
1142+
err = mlx5_cmd_exec(mdev->mdev, cmd_in,
10591143
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
10601144
cmd_out, cmd_out_len);
10611145
if (err)
@@ -1293,7 +1377,7 @@ DECLARE_UVERBS_NAMED_METHOD_DESTROY(
12931377
DECLARE_UVERBS_NAMED_METHOD(
12941378
MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
12951379
UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE,
1296-
MLX5_IB_OBJECT_DEVX_OBJ,
1380+
UVERBS_IDR_ANY_OBJECT,
12971381
UVERBS_ACCESS_WRITE,
12981382
UA_MANDATORY),
12991383
UVERBS_ATTR_PTR_IN(
@@ -1309,7 +1393,7 @@ DECLARE_UVERBS_NAMED_METHOD(
13091393
DECLARE_UVERBS_NAMED_METHOD(
13101394
MLX5_IB_METHOD_DEVX_OBJ_QUERY,
13111395
UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE,
1312-
MLX5_IB_OBJECT_DEVX_OBJ,
1396+
UVERBS_IDR_ANY_OBJECT,
13131397
UVERBS_ACCESS_READ,
13141398
UA_MANDATORY),
13151399
UVERBS_ATTR_PTR_IN(

0 commit comments

Comments
 (0)