diff options
Diffstat (limited to 'drivers/infiniband/core/uverbs_cmd.c')
-rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index a57d021d435a..a02c5a05c984 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
@@ -489,6 +489,7 @@ err_idr: | |||
489 | 489 | ||
490 | err_unreg: | 490 | err_unreg: |
491 | ib_dereg_mr(mr); | 491 | ib_dereg_mr(mr); |
492 | atomic_dec(&pd->usecnt); | ||
492 | 493 | ||
493 | err_up: | 494 | err_up: |
494 | up(&ib_uverbs_idr_mutex); | 495 | up(&ib_uverbs_idr_mutex); |
@@ -593,13 +594,18 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file, | |||
593 | if (cmd.comp_vector >= file->device->num_comp_vectors) | 594 | if (cmd.comp_vector >= file->device->num_comp_vectors) |
594 | return -EINVAL; | 595 | return -EINVAL; |
595 | 596 | ||
596 | if (cmd.comp_channel >= 0) | ||
597 | ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel); | ||
598 | |||
599 | uobj = kmalloc(sizeof *uobj, GFP_KERNEL); | 597 | uobj = kmalloc(sizeof *uobj, GFP_KERNEL); |
600 | if (!uobj) | 598 | if (!uobj) |
601 | return -ENOMEM; | 599 | return -ENOMEM; |
602 | 600 | ||
601 | if (cmd.comp_channel >= 0) { | ||
602 | ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel); | ||
603 | if (!ev_file) { | ||
604 | ret = -EINVAL; | ||
605 | goto err; | ||
606 | } | ||
607 | } | ||
608 | |||
603 | uobj->uobject.user_handle = cmd.user_handle; | 609 | uobj->uobject.user_handle = cmd.user_handle; |
604 | uobj->uobject.context = file->ucontext; | 610 | uobj->uobject.context = file->ucontext; |
605 | uobj->uverbs_file = file; | 611 | uobj->uverbs_file = file; |
@@ -663,6 +669,8 @@ err_up: | |||
663 | ib_destroy_cq(cq); | 669 | ib_destroy_cq(cq); |
664 | 670 | ||
665 | err: | 671 | err: |
672 | if (ev_file) | ||
673 | ib_uverbs_release_ucq(file, ev_file, uobj); | ||
666 | kfree(uobj); | 674 | kfree(uobj); |
667 | return ret; | 675 | return ret; |
668 | } | 676 | } |
@@ -935,6 +943,11 @@ err_idr: | |||
935 | 943 | ||
936 | err_destroy: | 944 | err_destroy: |
937 | ib_destroy_qp(qp); | 945 | ib_destroy_qp(qp); |
946 | atomic_dec(&pd->usecnt); | ||
947 | atomic_dec(&attr.send_cq->usecnt); | ||
948 | atomic_dec(&attr.recv_cq->usecnt); | ||
949 | if (attr.srq) | ||
950 | atomic_dec(&attr.srq->usecnt); | ||
938 | 951 | ||
939 | err_up: | 952 | err_up: |
940 | up(&ib_uverbs_idr_mutex); | 953 | up(&ib_uverbs_idr_mutex); |
@@ -1448,6 +1461,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file, | |||
1448 | attr.sl = cmd.attr.sl; | 1461 | attr.sl = cmd.attr.sl; |
1449 | attr.src_path_bits = cmd.attr.src_path_bits; | 1462 | attr.src_path_bits = cmd.attr.src_path_bits; |
1450 | attr.static_rate = cmd.attr.static_rate; | 1463 | attr.static_rate = cmd.attr.static_rate; |
1464 | attr.ah_flags = cmd.attr.is_global ? IB_AH_GRH : 0; | ||
1451 | attr.port_num = cmd.attr.port_num; | 1465 | attr.port_num = cmd.attr.port_num; |
1452 | attr.grh.flow_label = cmd.attr.grh.flow_label; | 1466 | attr.grh.flow_label = cmd.attr.grh.flow_label; |
1453 | attr.grh.sgid_index = cmd.attr.grh.sgid_index; | 1467 | attr.grh.sgid_index = cmd.attr.grh.sgid_index; |
@@ -1729,6 +1743,7 @@ err_idr: | |||
1729 | 1743 | ||
1730 | err_destroy: | 1744 | err_destroy: |
1731 | ib_destroy_srq(srq); | 1745 | ib_destroy_srq(srq); |
1746 | atomic_dec(&pd->usecnt); | ||
1732 | 1747 | ||
1733 | err_up: | 1748 | err_up: |
1734 | up(&ib_uverbs_idr_mutex); | 1749 | up(&ib_uverbs_idr_mutex); |