@@ -1423,13 +1423,6 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
1423
1423
}
1424
1424
device = xrcd -> device ;
1425
1425
} else {
1426
- pd = idr_read_pd (cmd .pd_handle , file -> ucontext );
1427
- scq = idr_read_cq (cmd .send_cq_handle , file -> ucontext , 0 );
1428
- if (!pd || !scq ) {
1429
- ret = - EINVAL ;
1430
- goto err_put ;
1431
- }
1432
-
1433
1426
if (cmd .qp_type == IB_QPT_XRC_INI ) {
1434
1427
cmd .max_recv_wr = cmd .max_recv_sge = 0 ;
1435
1428
} else {
@@ -1440,13 +1433,24 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
1440
1433
goto err_put ;
1441
1434
}
1442
1435
}
1443
- rcq = (cmd .recv_cq_handle == cmd .send_cq_handle ) ?
1444
- scq : idr_read_cq (cmd .recv_cq_handle , file -> ucontext , 1 );
1445
- if (!rcq ) {
1446
- ret = - EINVAL ;
1447
- goto err_put ;
1436
+
1437
+ if (cmd .recv_cq_handle != cmd .send_cq_handle ) {
1438
+ rcq = idr_read_cq (cmd .recv_cq_handle , file -> ucontext , 0 );
1439
+ if (!rcq ) {
1440
+ ret = - EINVAL ;
1441
+ goto err_put ;
1442
+ }
1448
1443
}
1449
1444
}
1445
+
1446
+ scq = idr_read_cq (cmd .send_cq_handle , file -> ucontext , !!rcq );
1447
+ rcq = rcq ?: scq ;
1448
+ pd = idr_read_pd (cmd .pd_handle , file -> ucontext );
1449
+ if (!pd || !scq ) {
1450
+ ret = - EINVAL ;
1451
+ goto err_put ;
1452
+ }
1453
+
1450
1454
device = pd -> device ;
1451
1455
}
1452
1456
@@ -2484,27 +2488,27 @@ static int __uverbs_create_xsrq(struct ib_uverbs_file *file,
2484
2488
init_uobj (& obj -> uevent .uobject , cmd -> user_handle , file -> ucontext , & srq_lock_class );
2485
2489
down_write (& obj -> uevent .uobject .mutex );
2486
2490
2487
- pd = idr_read_pd (cmd -> pd_handle , file -> ucontext );
2488
- if (!pd ) {
2489
- ret = - EINVAL ;
2490
- goto err ;
2491
- }
2492
-
2493
2491
if (cmd -> srq_type == IB_SRQT_XRC ) {
2494
- attr .ext .xrc .cq = idr_read_cq (cmd -> cq_handle , file -> ucontext , 0 );
2495
- if (!attr .ext .xrc .cq ) {
2496
- ret = - EINVAL ;
2497
- goto err_put_pd ;
2498
- }
2499
-
2500
2492
attr .ext .xrc .xrcd = idr_read_xrcd (cmd -> xrcd_handle , file -> ucontext , & xrcd_uobj );
2501
2493
if (!attr .ext .xrc .xrcd ) {
2502
2494
ret = - EINVAL ;
2503
- goto err_put_cq ;
2495
+ goto err ;
2504
2496
}
2505
2497
2506
2498
obj -> uxrcd = container_of (xrcd_uobj , struct ib_uxrcd_object , uobject );
2507
2499
atomic_inc (& obj -> uxrcd -> refcnt );
2500
+
2501
+ attr .ext .xrc .cq = idr_read_cq (cmd -> cq_handle , file -> ucontext , 0 );
2502
+ if (!attr .ext .xrc .cq ) {
2503
+ ret = - EINVAL ;
2504
+ goto err_put_xrcd ;
2505
+ }
2506
+ }
2507
+
2508
+ pd = idr_read_pd (cmd -> pd_handle , file -> ucontext );
2509
+ if (!pd ) {
2510
+ ret = - EINVAL ;
2511
+ goto err_put_cq ;
2508
2512
}
2509
2513
2510
2514
attr .event_handler = ib_uverbs_srq_event_handler ;
@@ -2581,17 +2585,17 @@ static int __uverbs_create_xsrq(struct ib_uverbs_file *file,
2581
2585
ib_destroy_srq (srq );
2582
2586
2583
2587
err_put :
2584
- if (cmd -> srq_type == IB_SRQT_XRC ) {
2585
- atomic_dec (& obj -> uxrcd -> refcnt );
2586
- put_uobj_read (xrcd_uobj );
2587
- }
2588
+ put_pd_read (pd );
2588
2589
2589
2590
err_put_cq :
2590
2591
if (cmd -> srq_type == IB_SRQT_XRC )
2591
2592
put_cq_read (attr .ext .xrc .cq );
2592
2593
2593
- err_put_pd :
2594
- put_pd_read (pd );
2594
+ err_put_xrcd :
2595
+ if (cmd -> srq_type == IB_SRQT_XRC ) {
2596
+ atomic_dec (& obj -> uxrcd -> refcnt );
2597
+ put_uobj_read (xrcd_uobj );
2598
+ }
2595
2599
2596
2600
err :
2597
2601
put_uobj_write (& obj -> uevent .uobject );
0 commit comments