@@ -1333,8 +1333,8 @@ void rdma_destroy_srq(struct rdma_cm_id *id)
1333
1333
ucma_destroy_cqs (id );
1334
1334
}
1335
1335
1336
- int rdma_create_qp (struct rdma_cm_id * id , struct ibv_pd * pd ,
1337
- struct ibv_qp_init_attr * qp_init_attr )
1336
+ int rdma_create_qp_ex (struct rdma_cm_id * id ,
1337
+ struct ibv_qp_init_attr_ex * attr )
1338
1338
{
1339
1339
struct cma_id_private * id_priv ;
1340
1340
struct ibv_qp * qp ;
@@ -1344,23 +1344,37 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
1344
1344
return ERR (EINVAL );
1345
1345
1346
1346
id_priv = container_of (id , struct cma_id_private , id );
1347
- if (!pd )
1348
- pd = id -> pd ;
1349
- else if (id -> verbs != pd -> context )
1347
+ if (!(attr -> comp_mask & IBV_QP_INIT_ATTR_PD ) || !attr -> pd ) {
1348
+ attr -> comp_mask |= IBV_QP_INIT_ATTR_PD ;
1349
+ attr -> pd = id -> pd ;
1350
+ } else if (id -> verbs != attr -> pd -> context )
1351
+ return ERR (EINVAL );
1352
+
1353
+ if ((id -> recv_cq && attr -> recv_cq && id -> recv_cq != attr -> recv_cq ) ||
1354
+ (id -> send_cq && attr -> send_cq && id -> send_cq != attr -> send_cq ))
1350
1355
return ERR (EINVAL );
1351
1356
1352
- ret = ucma_create_cqs (id , qp_init_attr -> send_cq ? 0 : qp_init_attr -> cap .max_send_wr ,
1353
- qp_init_attr -> recv_cq ? 0 : qp_init_attr -> cap .max_recv_wr );
1357
+ if (id -> qp_type == IBV_QPT_XRC_RECV ) {
1358
+ if (!(attr -> comp_mask & IBV_QP_INIT_ATTR_XRCD ) || !attr -> xrcd ) {
1359
+ attr -> xrcd = ucma_get_xrcd (id_priv -> cma_dev );
1360
+ if (!attr -> xrcd )
1361
+ return -1 ;
1362
+ attr -> comp_mask |= IBV_QP_INIT_ATTR_XRCD ;
1363
+ }
1364
+ }
1365
+
1366
+ ret = ucma_create_cqs (id , attr -> send_cq || id -> send_cq ? 0 : attr -> cap .max_send_wr ,
1367
+ attr -> recv_cq || id -> recv_cq ? 0 : attr -> cap .max_recv_wr );
1354
1368
if (ret )
1355
1369
return ret ;
1356
1370
1357
- if (!qp_init_attr -> send_cq )
1358
- qp_init_attr -> send_cq = id -> send_cq ;
1359
- if (!qp_init_attr -> recv_cq )
1360
- qp_init_attr -> recv_cq = id -> recv_cq ;
1361
- if (id -> srq && !qp_init_attr -> srq )
1362
- qp_init_attr -> srq = id -> srq ;
1363
- qp = ibv_create_qp ( pd , qp_init_attr );
1371
+ if (!attr -> send_cq )
1372
+ attr -> send_cq = id -> send_cq ;
1373
+ if (!attr -> recv_cq )
1374
+ attr -> recv_cq = id -> recv_cq ;
1375
+ if (id -> srq && !attr -> srq )
1376
+ attr -> srq = id -> srq ;
1377
+ qp = ibv_create_qp_ex ( id -> verbs , attr );
1364
1378
if (!qp ) {
1365
1379
ret = ERR (ENOMEM );
1366
1380
goto err1 ;
@@ -1373,7 +1387,7 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
1373
1387
if (ret )
1374
1388
goto err2 ;
1375
1389
1376
- id -> pd = pd ;
1390
+ id -> pd = qp -> pd ;
1377
1391
id -> qp = qp ;
1378
1392
return 0 ;
1379
1393
err2 :
@@ -1383,6 +1397,20 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
1383
1397
return ret ;
1384
1398
}
1385
1399
1400
+ int rdma_create_qp (struct rdma_cm_id * id , struct ibv_pd * pd ,
1401
+ struct ibv_qp_init_attr * qp_init_attr )
1402
+ {
1403
+ struct ibv_qp_init_attr_ex attr_ex ;
1404
+ int ret ;
1405
+
1406
+ memcpy (& attr_ex , qp_init_attr , sizeof * qp_init_attr );
1407
+ attr_ex .comp_mask = IBV_QP_INIT_ATTR_PD ;
1408
+ attr_ex .pd = pd ? pd : id -> pd ;
1409
+ ret = rdma_create_qp_ex (id , & attr_ex );
1410
+ memcpy (qp_init_attr , & attr_ex , sizeof * qp_init_attr );
1411
+ return ret ;
1412
+ }
1413
+
1386
1414
void rdma_destroy_qp (struct rdma_cm_id * id )
1387
1415
{
1388
1416
ibv_destroy_qp (id -> qp );
0 commit comments