9
9
#include <rdma/uverbs_ioctl.h>
10
10
#include <rdma/mlx5_user_ioctl_cmds.h>
11
11
#include <rdma/ib_umem.h>
12
+ #include <rdma/uverbs_std_types.h>
12
13
#include <linux/mlx5/driver.h>
13
14
#include <linux/mlx5/fs.h>
14
15
#include "mlx5_ib.h"
@@ -132,7 +133,7 @@ static u64 get_enc_obj_id(u16 opcode, u32 obj_id)
132
133
return ((u64 )opcode << 32 ) | obj_id ;
133
134
}
134
135
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 )
136
137
{
137
138
u16 opcode = MLX5_GET (general_obj_in_cmd_hdr , in , opcode );
138
139
u64 obj_id ;
@@ -336,13 +337,96 @@ static int devx_is_valid_obj_id(struct devx_obj *obj, const void *in)
336
337
MLX5_GET (arm_xrq_in , in , xrqn ));
337
338
break ;
338
339
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 )
339
351
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 ;
340
382
}
341
383
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
+ }
344
413
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
+ }
346
430
}
347
431
348
432
static void devx_set_umem_valid (const void * in )
@@ -994,7 +1078,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
994
1078
struct ib_uobject * uobj = uverbs_attr_get_uobject (attrs ,
995
1079
MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE );
996
1080
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 ) ;
998
1082
void * cmd_out ;
999
1083
int err ;
1000
1084
int uid ;
@@ -1006,7 +1090,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
1006
1090
if (!devx_is_obj_modify_cmd (cmd_in ))
1007
1091
return - EINVAL ;
1008
1092
1009
- if (!devx_is_valid_obj_id (obj , cmd_in ))
1093
+ if (!devx_is_valid_obj_id (uobj , cmd_in ))
1010
1094
return - EINVAL ;
1011
1095
1012
1096
cmd_out = uverbs_zalloc (attrs , cmd_out_len );
@@ -1016,7 +1100,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
1016
1100
MLX5_SET (general_obj_in_cmd_hdr , cmd_in , uid , uid );
1017
1101
devx_set_umem_valid (cmd_in );
1018
1102
1019
- err = mlx5_cmd_exec (obj -> mdev , cmd_in ,
1103
+ err = mlx5_cmd_exec (mdev -> mdev , cmd_in ,
1020
1104
uverbs_attr_get_len (attrs , MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN ),
1021
1105
cmd_out , cmd_out_len );
1022
1106
if (err )
@@ -1035,10 +1119,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
1035
1119
struct ib_uobject * uobj = uverbs_attr_get_uobject (attrs ,
1036
1120
MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE );
1037
1121
struct mlx5_ib_ucontext * c = to_mucontext (uobj -> context );
1038
- struct devx_obj * obj = uobj -> object ;
1039
1122
void * cmd_out ;
1040
1123
int err ;
1041
1124
int uid ;
1125
+ struct mlx5_ib_dev * mdev = to_mdev (uobj -> context -> device );
1042
1126
1043
1127
uid = devx_get_uid (c , cmd_in );
1044
1128
if (uid < 0 )
@@ -1047,15 +1131,15 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
1047
1131
if (!devx_is_obj_query_cmd (cmd_in ))
1048
1132
return - EINVAL ;
1049
1133
1050
- if (!devx_is_valid_obj_id (obj , cmd_in ))
1134
+ if (!devx_is_valid_obj_id (uobj , cmd_in ))
1051
1135
return - EINVAL ;
1052
1136
1053
1137
cmd_out = uverbs_zalloc (attrs , cmd_out_len );
1054
1138
if (IS_ERR (cmd_out ))
1055
1139
return PTR_ERR (cmd_out );
1056
1140
1057
1141
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 ,
1059
1143
uverbs_attr_get_len (attrs , MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN ),
1060
1144
cmd_out , cmd_out_len );
1061
1145
if (err )
@@ -1293,7 +1377,7 @@ DECLARE_UVERBS_NAMED_METHOD_DESTROY(
1293
1377
DECLARE_UVERBS_NAMED_METHOD (
1294
1378
MLX5_IB_METHOD_DEVX_OBJ_MODIFY ,
1295
1379
UVERBS_ATTR_IDR (MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE ,
1296
- MLX5_IB_OBJECT_DEVX_OBJ ,
1380
+ UVERBS_IDR_ANY_OBJECT ,
1297
1381
UVERBS_ACCESS_WRITE ,
1298
1382
UA_MANDATORY ),
1299
1383
UVERBS_ATTR_PTR_IN (
@@ -1309,7 +1393,7 @@ DECLARE_UVERBS_NAMED_METHOD(
1309
1393
DECLARE_UVERBS_NAMED_METHOD (
1310
1394
MLX5_IB_METHOD_DEVX_OBJ_QUERY ,
1311
1395
UVERBS_ATTR_IDR (MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE ,
1312
- MLX5_IB_OBJECT_DEVX_OBJ ,
1396
+ UVERBS_IDR_ANY_OBJECT ,
1313
1397
UVERBS_ACCESS_READ ,
1314
1398
UA_MANDATORY ),
1315
1399
UVERBS_ATTR_PTR_IN (
0 commit comments