diff options
author | Leon Romanovsky <leonro@mellanox.com> | 2019-06-16 08:05:20 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2019-06-20 15:17:59 -0400 |
commit | 836a0fbb3e76f704ad65ddfb57f00725245e509b (patch) | |
tree | 30d961b48c7029a952e6eeb5077d76ce0e4a5221 | |
parent | 89a6da3cb8f30ee0aeca924d84bef688f22f883e (diff) |
RDMA: Check umem pointer validity prior to release
Update ib_umem_release() to behave similarly to kfree() and allow
submitting NULL pointer as safe input to this function.
Fixes: a52c8e2469c3 ("RDMA: Clean destroy CQ in drivers do not return errors")
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
26 files changed, 73 insertions, 132 deletions
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 54628ef879f0..08da840ed7ee 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c | |||
@@ -361,6 +361,9 @@ static void __ib_umem_release_tail(struct ib_umem *umem) | |||
361 | */ | 361 | */ |
362 | void ib_umem_release(struct ib_umem *umem) | 362 | void ib_umem_release(struct ib_umem *umem) |
363 | { | 363 | { |
364 | if (!umem) | ||
365 | return; | ||
366 | |||
364 | if (umem->is_odp) { | 367 | if (umem->is_odp) { |
365 | ib_umem_odp_release(to_ib_umem_odp(umem)); | 368 | ib_umem_odp_release(to_ib_umem_odp(umem)); |
366 | __ib_umem_release_tail(umem); | 369 | __ib_umem_release_tail(umem); |
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c index 44cc5f19df3b..a91653aabf38 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c | |||
@@ -805,10 +805,8 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata) | |||
805 | rdev->sqp_ah = NULL; | 805 | rdev->sqp_ah = NULL; |
806 | } | 806 | } |
807 | 807 | ||
808 | if (!IS_ERR_OR_NULL(qp->rumem)) | 808 | ib_umem_release(qp->rumem); |
809 | ib_umem_release(qp->rumem); | 809 | ib_umem_release(qp->sumem); |
810 | if (!IS_ERR_OR_NULL(qp->sumem)) | ||
811 | ib_umem_release(qp->sumem); | ||
812 | 810 | ||
813 | mutex_lock(&rdev->qp_lock); | 811 | mutex_lock(&rdev->qp_lock); |
814 | list_del(&qp->list); | 812 | list_del(&qp->list); |
@@ -1201,12 +1199,8 @@ struct ib_qp *bnxt_re_create_qp(struct ib_pd *ib_pd, | |||
1201 | qp_destroy: | 1199 | qp_destroy: |
1202 | bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp); | 1200 | bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp); |
1203 | free_umem: | 1201 | free_umem: |
1204 | if (udata) { | 1202 | ib_umem_release(qp->rumem); |
1205 | if (qp->rumem) | 1203 | ib_umem_release(qp->sumem); |
1206 | ib_umem_release(qp->rumem); | ||
1207 | if (qp->sumem) | ||
1208 | ib_umem_release(qp->sumem); | ||
1209 | } | ||
1210 | fail: | 1204 | fail: |
1211 | kfree(qp); | 1205 | kfree(qp); |
1212 | return ERR_PTR(rc); | 1206 | return ERR_PTR(rc); |
@@ -1302,8 +1296,7 @@ void bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata) | |||
1302 | if (qplib_srq->cq) | 1296 | if (qplib_srq->cq) |
1303 | nq = qplib_srq->cq->nq; | 1297 | nq = qplib_srq->cq->nq; |
1304 | bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq); | 1298 | bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq); |
1305 | if (srq->umem) | 1299 | ib_umem_release(srq->umem); |
1306 | ib_umem_release(srq->umem); | ||
1307 | atomic_dec(&rdev->srq_count); | 1300 | atomic_dec(&rdev->srq_count); |
1308 | if (nq) | 1301 | if (nq) |
1309 | nq->budget--; | 1302 | nq->budget--; |
@@ -1412,8 +1405,7 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq, | |||
1412 | return 0; | 1405 | return 0; |
1413 | 1406 | ||
1414 | fail: | 1407 | fail: |
1415 | if (srq->umem) | 1408 | ib_umem_release(srq->umem); |
1416 | ib_umem_release(srq->umem); | ||
1417 | exit: | 1409 | exit: |
1418 | return rc; | 1410 | return rc; |
1419 | } | 1411 | } |
@@ -2528,8 +2520,7 @@ void bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata) | |||
2528 | nq = cq->qplib_cq.nq; | 2520 | nq = cq->qplib_cq.nq; |
2529 | 2521 | ||
2530 | bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq); | 2522 | bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq); |
2531 | if (!cq->umem) | 2523 | ib_umem_release(cq->umem); |
2532 | ib_umem_release(cq->umem); | ||
2533 | 2524 | ||
2534 | atomic_dec(&rdev->cq_count); | 2525 | atomic_dec(&rdev->cq_count); |
2535 | nq->budget--; | 2526 | nq->budget--; |
@@ -2632,8 +2623,7 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, | |||
2632 | return 0; | 2623 | return 0; |
2633 | 2624 | ||
2634 | c2fail: | 2625 | c2fail: |
2635 | if (udata) | 2626 | ib_umem_release(cq->umem); |
2636 | ib_umem_release(cq->umem); | ||
2637 | fail: | 2627 | fail: |
2638 | kfree(cq->cql); | 2628 | kfree(cq->cql); |
2639 | return rc; | 2629 | return rc; |
@@ -3340,8 +3330,7 @@ int bnxt_re_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) | |||
3340 | mr->npages = 0; | 3330 | mr->npages = 0; |
3341 | mr->pages = NULL; | 3331 | mr->pages = NULL; |
3342 | } | 3332 | } |
3343 | if (!IS_ERR_OR_NULL(mr->ib_umem)) | 3333 | ib_umem_release(mr->ib_umem); |
3344 | ib_umem_release(mr->ib_umem); | ||
3345 | 3334 | ||
3346 | kfree(mr); | 3335 | kfree(mr); |
3347 | atomic_dec(&rdev->mr_count); | 3336 | atomic_dec(&rdev->mr_count); |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c index 810fa96af2e9..e775c1a1a450 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.c +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c | |||
@@ -346,8 +346,7 @@ static int iwch_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) | |||
346 | xa_erase_irq(&rhp->mrs, mmid); | 346 | xa_erase_irq(&rhp->mrs, mmid); |
347 | if (mhp->kva) | 347 | if (mhp->kva) |
348 | kfree((void *) (unsigned long) mhp->kva); | 348 | kfree((void *) (unsigned long) mhp->kva); |
349 | if (mhp->umem) | 349 | ib_umem_release(mhp->umem); |
350 | ib_umem_release(mhp->umem); | ||
351 | pr_debug("%s mmid 0x%x ptr %p\n", __func__, mmid, mhp); | 350 | pr_debug("%s mmid 0x%x ptr %p\n", __func__, mmid, mhp); |
352 | kfree(mhp); | 351 | kfree(mhp); |
353 | return 0; | 352 | return 0; |
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c index fe3733c4026d..aa772ee0706f 100644 --- a/drivers/infiniband/hw/cxgb4/mem.c +++ b/drivers/infiniband/hw/cxgb4/mem.c | |||
@@ -808,8 +808,7 @@ int c4iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) | |||
808 | mhp->attr.pbl_size << 3); | 808 | mhp->attr.pbl_size << 3); |
809 | if (mhp->kva) | 809 | if (mhp->kva) |
810 | kfree((void *) (unsigned long) mhp->kva); | 810 | kfree((void *) (unsigned long) mhp->kva); |
811 | if (mhp->umem) | 811 | ib_umem_release(mhp->umem); |
812 | ib_umem_release(mhp->umem); | ||
813 | pr_debug("mmid 0x%x ptr %p\n", mmid, mhp); | 812 | pr_debug("mmid 0x%x ptr %p\n", mmid, mhp); |
814 | c4iw_put_wr_wait(mhp->wr_waitp); | 813 | c4iw_put_wr_wait(mhp->wr_waitp); |
815 | kfree(mhp); | 814 | kfree(mhp); |
diff --git a/drivers/infiniband/hw/efa/efa_verbs.c b/drivers/infiniband/hw/efa/efa_verbs.c index a9372c9e4b30..5e6e5eb65cff 100644 --- a/drivers/infiniband/hw/efa/efa_verbs.c +++ b/drivers/infiniband/hw/efa/efa_verbs.c | |||
@@ -1513,8 +1513,8 @@ int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) | |||
1513 | err = efa_com_dereg_mr(&dev->edev, ¶ms); | 1513 | err = efa_com_dereg_mr(&dev->edev, ¶ms); |
1514 | if (err) | 1514 | if (err) |
1515 | return err; | 1515 | return err; |
1516 | ib_umem_release(mr->umem); | ||
1517 | } | 1516 | } |
1517 | ib_umem_release(mr->umem); | ||
1518 | 1518 | ||
1519 | kfree(mr); | 1519 | kfree(mr); |
1520 | 1520 | ||
diff --git a/drivers/infiniband/hw/hns/hns_roce_cq.c b/drivers/infiniband/hw/hns/hns_roce_cq.c index 7e198c9ffbfe..6b4d8e50aabe 100644 --- a/drivers/infiniband/hw/hns/hns_roce_cq.c +++ b/drivers/infiniband/hw/hns/hns_roce_cq.c | |||
@@ -423,9 +423,8 @@ err_dbmap: | |||
423 | 423 | ||
424 | err_mtt: | 424 | err_mtt: |
425 | hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); | 425 | hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); |
426 | if (udata) | 426 | ib_umem_release(hr_cq->umem); |
427 | ib_umem_release(hr_cq->umem); | 427 | if (!udata) |
428 | else | ||
429 | hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf, | 428 | hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf, |
430 | hr_cq->ib_cq.cqe); | 429 | hr_cq->ib_cq.cqe); |
431 | 430 | ||
@@ -451,9 +450,8 @@ void hns_roce_ib_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata) | |||
451 | hns_roce_free_cq(hr_dev, hr_cq); | 450 | hns_roce_free_cq(hr_dev, hr_cq); |
452 | hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); | 451 | hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); |
453 | 452 | ||
453 | ib_umem_release(hr_cq->umem); | ||
454 | if (udata) { | 454 | if (udata) { |
455 | ib_umem_release(hr_cq->umem); | ||
456 | |||
457 | if (hr_cq->db_en == 1) | 455 | if (hr_cq->db_en == 1) |
458 | hns_roce_db_unmap_user(rdma_udata_to_drv_context( | 456 | hns_roce_db_unmap_user(rdma_udata_to_drv_context( |
459 | udata, | 457 | udata, |
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c index c899879da222..cb004190ccba 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c | |||
@@ -1163,8 +1163,7 @@ free_mr: | |||
1163 | hns_roce_bitmap_free(&hr_dev->mr_table.mtpt_bitmap, | 1163 | hns_roce_bitmap_free(&hr_dev->mr_table.mtpt_bitmap, |
1164 | key_to_hw_index(mr->key), 0); | 1164 | key_to_hw_index(mr->key), 0); |
1165 | 1165 | ||
1166 | if (mr->umem) | 1166 | ib_umem_release(mr->umem); |
1167 | ib_umem_release(mr->umem); | ||
1168 | 1167 | ||
1169 | kfree(mr); | 1168 | kfree(mr); |
1170 | 1169 | ||
@@ -3641,9 +3640,8 @@ int hns_roce_v1_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) | |||
3641 | 3640 | ||
3642 | hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt); | 3641 | hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt); |
3643 | 3642 | ||
3644 | if (udata) | 3643 | ib_umem_release(hr_qp->umem); |
3645 | ib_umem_release(hr_qp->umem); | 3644 | if (!udata) { |
3646 | else { | ||
3647 | kfree(hr_qp->sq.wrid); | 3645 | kfree(hr_qp->sq.wrid); |
3648 | kfree(hr_qp->rq.wrid); | 3646 | kfree(hr_qp->rq.wrid); |
3649 | 3647 | ||
@@ -3694,9 +3692,8 @@ static void hns_roce_v1_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) | |||
3694 | 3692 | ||
3695 | hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); | 3693 | hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); |
3696 | 3694 | ||
3697 | if (ibcq->uobject) | 3695 | ib_umem_release(hr_cq->umem); |
3698 | ib_umem_release(hr_cq->umem); | 3696 | if (!udata) { |
3699 | else { | ||
3700 | /* Free the buff of stored cq */ | 3697 | /* Free the buff of stored cq */ |
3701 | cq_buf_size = (ibcq->cqe + 1) * hr_dev->caps.cq_entry_sz; | 3698 | cq_buf_size = (ibcq->cqe + 1) * hr_dev->caps.cq_entry_sz; |
3702 | hns_roce_buf_free(hr_dev, cq_buf_size, &hr_cq->hr_buf.hr_buf); | 3699 | hns_roce_buf_free(hr_dev, cq_buf_size, &hr_cq->hr_buf.hr_buf); |
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index 5c8551b54444..edd62b4dc0a0 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | |||
@@ -4582,7 +4582,6 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev, | |||
4582 | 4582 | ||
4583 | if (hr_qp->rq.wqe_cnt && (hr_qp->rdb_en == 1)) | 4583 | if (hr_qp->rq.wqe_cnt && (hr_qp->rdb_en == 1)) |
4584 | hns_roce_db_unmap_user(context, &hr_qp->rdb); | 4584 | hns_roce_db_unmap_user(context, &hr_qp->rdb); |
4585 | ib_umem_release(hr_qp->umem); | ||
4586 | } else { | 4585 | } else { |
4587 | kfree(hr_qp->sq.wrid); | 4586 | kfree(hr_qp->sq.wrid); |
4588 | kfree(hr_qp->rq.wrid); | 4587 | kfree(hr_qp->rq.wrid); |
@@ -4590,6 +4589,7 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev, | |||
4590 | if (hr_qp->rq.wqe_cnt) | 4589 | if (hr_qp->rq.wqe_cnt) |
4591 | hns_roce_free_db(hr_dev, &hr_qp->rdb); | 4590 | hns_roce_free_db(hr_dev, &hr_qp->rdb); |
4592 | } | 4591 | } |
4592 | ib_umem_release(hr_qp->umem); | ||
4593 | 4593 | ||
4594 | if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) && | 4594 | if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) && |
4595 | hr_qp->rq.wqe_cnt) { | 4595 | hr_qp->rq.wqe_cnt) { |
diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c index 6db0dae18ab7..adf075183dfb 100644 --- a/drivers/infiniband/hw/hns/hns_roce_mr.c +++ b/drivers/infiniband/hw/hns/hns_roce_mr.c | |||
@@ -1298,9 +1298,7 @@ int hns_roce_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) | |||
1298 | } else { | 1298 | } else { |
1299 | hns_roce_mr_free(hr_dev, mr); | 1299 | hns_roce_mr_free(hr_dev, mr); |
1300 | 1300 | ||
1301 | if (mr->umem) | 1301 | ib_umem_release(mr->umem); |
1302 | ib_umem_release(mr->umem); | ||
1303 | |||
1304 | kfree(mr); | 1302 | kfree(mr); |
1305 | } | 1303 | } |
1306 | 1304 | ||
diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c index 99ec5d43b99b..7e9db8236072 100644 --- a/drivers/infiniband/hw/hns/hns_roce_qp.c +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c | |||
@@ -938,10 +938,9 @@ err_get_bufs: | |||
938 | hns_roce_free_buf_list(buf_list, hr_qp->region_cnt); | 938 | hns_roce_free_buf_list(buf_list, hr_qp->region_cnt); |
939 | 939 | ||
940 | err_alloc_list: | 940 | err_alloc_list: |
941 | if (hr_qp->umem) | 941 | if (!hr_qp->umem) |
942 | ib_umem_release(hr_qp->umem); | ||
943 | else | ||
944 | hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf); | 942 | hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf); |
943 | ib_umem_release(hr_qp->umem); | ||
945 | 944 | ||
946 | err_db: | 945 | err_db: |
947 | if (!udata && hns_roce_qp_has_rq(init_attr) && | 946 | if (!udata && hns_roce_qp_has_rq(init_attr) && |
diff --git a/drivers/infiniband/hw/hns/hns_roce_srq.c b/drivers/infiniband/hw/hns/hns_roce_srq.c index c222f243953a..de645be8aa48 100644 --- a/drivers/infiniband/hw/hns/hns_roce_srq.c +++ b/drivers/infiniband/hw/hns/hns_roce_srq.c | |||
@@ -380,8 +380,7 @@ err_idx_buf: | |||
380 | hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); | 380 | hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); |
381 | 381 | ||
382 | err_idx_mtt: | 382 | err_idx_mtt: |
383 | if (udata) | 383 | ib_umem_release(srq->idx_que.umem); |
384 | ib_umem_release(srq->idx_que.umem); | ||
385 | 384 | ||
386 | err_create_idx: | 385 | err_create_idx: |
387 | hns_roce_buf_free(hr_dev, srq->idx_que.buf_size, | 386 | hns_roce_buf_free(hr_dev, srq->idx_que.buf_size, |
@@ -392,9 +391,8 @@ err_srq_mtt: | |||
392 | hns_roce_mtt_cleanup(hr_dev, &srq->mtt); | 391 | hns_roce_mtt_cleanup(hr_dev, &srq->mtt); |
393 | 392 | ||
394 | err_buf: | 393 | err_buf: |
395 | if (udata) | 394 | ib_umem_release(srq->umem); |
396 | ib_umem_release(srq->umem); | 395 | if (!udata) |
397 | else | ||
398 | hns_roce_buf_free(hr_dev, srq_buf_size, &srq->buf); | 396 | hns_roce_buf_free(hr_dev, srq_buf_size, &srq->buf); |
399 | 397 | ||
400 | return ret; | 398 | return ret; |
@@ -408,15 +406,15 @@ void hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata) | |||
408 | hns_roce_srq_free(hr_dev, srq); | 406 | hns_roce_srq_free(hr_dev, srq); |
409 | hns_roce_mtt_cleanup(hr_dev, &srq->mtt); | 407 | hns_roce_mtt_cleanup(hr_dev, &srq->mtt); |
410 | 408 | ||
411 | if (ibsrq->uobject) { | 409 | if (udata) { |
412 | hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); | 410 | hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); |
413 | ib_umem_release(srq->idx_que.umem); | ||
414 | ib_umem_release(srq->umem); | ||
415 | } else { | 411 | } else { |
416 | kvfree(srq->wrid); | 412 | kvfree(srq->wrid); |
417 | hns_roce_buf_free(hr_dev, srq->max << srq->wqe_shift, | 413 | hns_roce_buf_free(hr_dev, srq->max << srq->wqe_shift, |
418 | &srq->buf); | 414 | &srq->buf); |
419 | } | 415 | } |
416 | ib_umem_release(srq->idx_que.umem); | ||
417 | ib_umem_release(srq->umem); | ||
420 | } | 418 | } |
421 | 419 | ||
422 | int hns_roce_init_srq_table(struct hns_roce_dev *hr_dev) | 420 | int hns_roce_init_srq_table(struct hns_roce_dev *hr_dev) |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c index 3100b0c31b0a..3c0c6aabc64e 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c | |||
@@ -2004,8 +2004,7 @@ static int i40iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) | |||
2004 | struct cqp_commands_info *cqp_info; | 2004 | struct cqp_commands_info *cqp_info; |
2005 | u32 stag_idx; | 2005 | u32 stag_idx; |
2006 | 2006 | ||
2007 | if (iwmr->region) | 2007 | ib_umem_release(iwmr->region); |
2008 | ib_umem_release(iwmr->region); | ||
2009 | 2008 | ||
2010 | if (iwmr->type != IW_MEMREG_TYPE_MEM) { | 2009 | if (iwmr->type != IW_MEMREG_TYPE_MEM) { |
2011 | /* region is released. only test for userness. */ | 2010 | /* region is released. only test for userness. */ |
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 72f238ddafb5..a7d238d312f0 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -277,9 +277,8 @@ err_dbmap: | |||
277 | err_mtt: | 277 | err_mtt: |
278 | mlx4_mtt_cleanup(dev->dev, &cq->buf.mtt); | 278 | mlx4_mtt_cleanup(dev->dev, &cq->buf.mtt); |
279 | 279 | ||
280 | if (udata) | 280 | ib_umem_release(cq->umem); |
281 | ib_umem_release(cq->umem); | 281 | if (!udata) |
282 | else | ||
283 | mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); | 282 | mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); |
284 | 283 | ||
285 | err_db: | 284 | err_db: |
@@ -468,11 +467,8 @@ err_buf: | |||
468 | kfree(cq->resize_buf); | 467 | kfree(cq->resize_buf); |
469 | cq->resize_buf = NULL; | 468 | cq->resize_buf = NULL; |
470 | 469 | ||
471 | if (cq->resize_umem) { | 470 | ib_umem_release(cq->resize_umem); |
472 | ib_umem_release(cq->resize_umem); | 471 | cq->resize_umem = NULL; |
473 | cq->resize_umem = NULL; | ||
474 | } | ||
475 | |||
476 | out: | 472 | out: |
477 | mutex_unlock(&cq->resize_mutex); | 473 | mutex_unlock(&cq->resize_mutex); |
478 | 474 | ||
@@ -494,11 +490,11 @@ void mlx4_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata) | |||
494 | struct mlx4_ib_ucontext, | 490 | struct mlx4_ib_ucontext, |
495 | ibucontext), | 491 | ibucontext), |
496 | &mcq->db); | 492 | &mcq->db); |
497 | ib_umem_release(mcq->umem); | ||
498 | } else { | 493 | } else { |
499 | mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe); | 494 | mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe); |
500 | mlx4_db_free(dev->dev, &mcq->db); | 495 | mlx4_db_free(dev->dev, &mcq->db); |
501 | } | 496 | } |
497 | ib_umem_release(mcq->umem); | ||
502 | } | 498 | } |
503 | 499 | ||
504 | static void dump_cqe(void *cqe) | 500 | static void dump_cqe(void *cqe) |
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c index 520364defa28..82aff2f2fdc2 100644 --- a/drivers/infiniband/hw/mlx4/qp.c +++ b/drivers/infiniband/hw/mlx4/qp.c | |||
@@ -1207,10 +1207,9 @@ err_mtt: | |||
1207 | mlx4_mtt_cleanup(dev->dev, &qp->mtt); | 1207 | mlx4_mtt_cleanup(dev->dev, &qp->mtt); |
1208 | 1208 | ||
1209 | err_buf: | 1209 | err_buf: |
1210 | if (qp->umem) | 1210 | if (!qp->umem) |
1211 | ib_umem_release(qp->umem); | ||
1212 | else | ||
1213 | mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf); | 1211 | mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf); |
1212 | ib_umem_release(qp->umem); | ||
1214 | 1213 | ||
1215 | err_db: | 1214 | err_db: |
1216 | if (!udata && qp_has_rq(init_attr)) | 1215 | if (!udata && qp_has_rq(init_attr)) |
@@ -1421,7 +1420,6 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp, | |||
1421 | 1420 | ||
1422 | mlx4_ib_db_unmap_user(mcontext, &qp->db); | 1421 | mlx4_ib_db_unmap_user(mcontext, &qp->db); |
1423 | } | 1422 | } |
1424 | ib_umem_release(qp->umem); | ||
1425 | } else { | 1423 | } else { |
1426 | kvfree(qp->sq.wrid); | 1424 | kvfree(qp->sq.wrid); |
1427 | kvfree(qp->rq.wrid); | 1425 | kvfree(qp->rq.wrid); |
@@ -1432,6 +1430,7 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp, | |||
1432 | if (qp->rq.wqe_cnt) | 1430 | if (qp->rq.wqe_cnt) |
1433 | mlx4_db_free(dev->dev, &qp->db); | 1431 | mlx4_db_free(dev->dev, &qp->db); |
1434 | } | 1432 | } |
1433 | ib_umem_release(qp->umem); | ||
1435 | 1434 | ||
1436 | del_gid_entries(qp); | 1435 | del_gid_entries(qp); |
1437 | } | 1436 | } |
diff --git a/drivers/infiniband/hw/mlx4/srq.c b/drivers/infiniband/hw/mlx4/srq.c index c9f555e04c9f..848db7264cc9 100644 --- a/drivers/infiniband/hw/mlx4/srq.c +++ b/drivers/infiniband/hw/mlx4/srq.c | |||
@@ -204,10 +204,9 @@ err_mtt: | |||
204 | mlx4_mtt_cleanup(dev->dev, &srq->mtt); | 204 | mlx4_mtt_cleanup(dev->dev, &srq->mtt); |
205 | 205 | ||
206 | err_buf: | 206 | err_buf: |
207 | if (srq->umem) | 207 | if (!srq->umem) |
208 | ib_umem_release(srq->umem); | ||
209 | else | ||
210 | mlx4_buf_free(dev->dev, buf_size, &srq->buf); | 208 | mlx4_buf_free(dev->dev, buf_size, &srq->buf); |
209 | ib_umem_release(srq->umem); | ||
211 | 210 | ||
212 | err_db: | 211 | err_db: |
213 | if (!udata) | 212 | if (!udata) |
@@ -275,13 +274,13 @@ void mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata) | |||
275 | struct mlx4_ib_ucontext, | 274 | struct mlx4_ib_ucontext, |
276 | ibucontext), | 275 | ibucontext), |
277 | &msrq->db); | 276 | &msrq->db); |
278 | ib_umem_release(msrq->umem); | ||
279 | } else { | 277 | } else { |
280 | kvfree(msrq->wrid); | 278 | kvfree(msrq->wrid); |
281 | mlx4_buf_free(dev->dev, msrq->msrq.max << msrq->msrq.wqe_shift, | 279 | mlx4_buf_free(dev->dev, msrq->msrq.max << msrq->msrq.wqe_shift, |
282 | &msrq->buf); | 280 | &msrq->buf); |
283 | mlx4_db_free(dev->dev, &msrq->db); | 281 | mlx4_db_free(dev->dev, &msrq->db); |
284 | } | 282 | } |
283 | ib_umem_release(msrq->umem); | ||
285 | } | 284 | } |
286 | 285 | ||
287 | void mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index) | 286 | void mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index) |
diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c index 07b73df0e1a3..22230fd7d741 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c | |||
@@ -1125,11 +1125,6 @@ static int resize_user(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq, | |||
1125 | return 0; | 1125 | return 0; |
1126 | } | 1126 | } |
1127 | 1127 | ||
1128 | static void un_resize_user(struct mlx5_ib_cq *cq) | ||
1129 | { | ||
1130 | ib_umem_release(cq->resize_umem); | ||
1131 | } | ||
1132 | |||
1133 | static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq, | 1128 | static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq, |
1134 | int entries, int cqe_size) | 1129 | int entries, int cqe_size) |
1135 | { | 1130 | { |
@@ -1152,12 +1147,6 @@ ex: | |||
1152 | return err; | 1147 | return err; |
1153 | } | 1148 | } |
1154 | 1149 | ||
1155 | static void un_resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq) | ||
1156 | { | ||
1157 | free_cq_buf(dev, cq->resize_buf); | ||
1158 | cq->resize_buf = NULL; | ||
1159 | } | ||
1160 | |||
1161 | static int copy_resize_cqes(struct mlx5_ib_cq *cq) | 1150 | static int copy_resize_cqes(struct mlx5_ib_cq *cq) |
1162 | { | 1151 | { |
1163 | struct mlx5_ib_dev *dev = to_mdev(cq->ibcq.device); | 1152 | struct mlx5_ib_dev *dev = to_mdev(cq->ibcq.device); |
@@ -1338,10 +1327,11 @@ ex_alloc: | |||
1338 | kvfree(in); | 1327 | kvfree(in); |
1339 | 1328 | ||
1340 | ex_resize: | 1329 | ex_resize: |
1341 | if (udata) | 1330 | ib_umem_release(cq->resize_umem); |
1342 | un_resize_user(cq); | 1331 | if (!udata) { |
1343 | else | 1332 | free_cq_buf(dev, cq->resize_buf); |
1344 | un_resize_kernel(dev, cq); | 1333 | cq->resize_buf = NULL; |
1334 | } | ||
1345 | ex: | 1335 | ex: |
1346 | mutex_unlock(&cq->resize_mutex); | 1336 | mutex_unlock(&cq->resize_mutex); |
1347 | return err; | 1337 | return err; |
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 4d033796dcfc..994abcebb057 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c | |||
@@ -1507,10 +1507,9 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, | |||
1507 | return 0; | 1507 | return 0; |
1508 | 1508 | ||
1509 | err: | 1509 | err: |
1510 | if (mr->umem) { | 1510 | ib_umem_release(mr->umem); |
1511 | ib_umem_release(mr->umem); | 1511 | mr->umem = NULL; |
1512 | mr->umem = NULL; | 1512 | |
1513 | } | ||
1514 | clean_mr(dev, mr); | 1513 | clean_mr(dev, mr); |
1515 | return err; | 1514 | return err; |
1516 | } | 1515 | } |
@@ -1630,10 +1629,10 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) | |||
1630 | * remove the DMA mapping. | 1629 | * remove the DMA mapping. |
1631 | */ | 1630 | */ |
1632 | mlx5_mr_cache_free(dev, mr); | 1631 | mlx5_mr_cache_free(dev, mr); |
1633 | if (umem) { | 1632 | ib_umem_release(umem); |
1634 | ib_umem_release(umem); | 1633 | if (umem) |
1635 | atomic_sub(npages, &dev->mdev->priv.reg_pages); | 1634 | atomic_sub(npages, &dev->mdev->priv.reg_pages); |
1636 | } | 1635 | |
1637 | if (!mr->allocated_from_cache) | 1636 | if (!mr->allocated_from_cache) |
1638 | kfree(mr); | 1637 | kfree(mr); |
1639 | } | 1638 | } |
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index ae847709b3d3..12ccbd584d2a 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c | |||
@@ -790,8 +790,7 @@ static void destroy_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd, | |||
790 | atomic_dec(&dev->delay_drop.rqs_cnt); | 790 | atomic_dec(&dev->delay_drop.rqs_cnt); |
791 | 791 | ||
792 | mlx5_ib_db_unmap_user(context, &rwq->db); | 792 | mlx5_ib_db_unmap_user(context, &rwq->db); |
793 | if (rwq->umem) | 793 | ib_umem_release(rwq->umem); |
794 | ib_umem_release(rwq->umem); | ||
795 | } | 794 | } |
796 | 795 | ||
797 | static int create_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd, | 796 | static int create_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd, |
@@ -977,8 +976,7 @@ err_free: | |||
977 | kvfree(*in); | 976 | kvfree(*in); |
978 | 977 | ||
979 | err_umem: | 978 | err_umem: |
980 | if (ubuffer->umem) | 979 | ib_umem_release(ubuffer->umem); |
981 | ib_umem_release(ubuffer->umem); | ||
982 | 980 | ||
983 | err_bfreg: | 981 | err_bfreg: |
984 | if (bfregn != MLX5_IB_INVALID_BFREG) | 982 | if (bfregn != MLX5_IB_INVALID_BFREG) |
@@ -997,8 +995,7 @@ static void destroy_qp_user(struct mlx5_ib_dev *dev, struct ib_pd *pd, | |||
997 | ibucontext); | 995 | ibucontext); |
998 | 996 | ||
999 | mlx5_ib_db_unmap_user(context, &qp->db); | 997 | mlx5_ib_db_unmap_user(context, &qp->db); |
1000 | if (base->ubuffer.umem) | 998 | ib_umem_release(base->ubuffer.umem); |
1001 | ib_umem_release(base->ubuffer.umem); | ||
1002 | 999 | ||
1003 | /* | 1000 | /* |
1004 | * Free only the BFREGs which are handled by the kernel. | 1001 | * Free only the BFREGs which are handled by the kernel. |
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index d97124bee703..23554d8bf241 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c | |||
@@ -953,8 +953,7 @@ static int mthca_dereg_mr(struct ib_mr *mr, struct ib_udata *udata) | |||
953 | struct mthca_mr *mmr = to_mmr(mr); | 953 | struct mthca_mr *mmr = to_mmr(mr); |
954 | 954 | ||
955 | mthca_free_mr(to_mdev(mr->device), mmr); | 955 | mthca_free_mr(to_mdev(mr->device), mmr); |
956 | if (mmr->umem) | 956 | ib_umem_release(mmr->umem); |
957 | ib_umem_release(mmr->umem); | ||
958 | kfree(mmr); | 957 | kfree(mmr); |
959 | 958 | ||
960 | return 0; | 959 | return 0; |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c index 10b35edb286b..bccc11378109 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | |||
@@ -925,8 +925,7 @@ int ocrdma_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) | |||
925 | ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr); | 925 | ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr); |
926 | 926 | ||
927 | /* it could be user registered memory. */ | 927 | /* it could be user registered memory. */ |
928 | if (mr->umem) | 928 | ib_umem_release(mr->umem); |
929 | ib_umem_release(mr->umem); | ||
930 | kfree(mr); | 929 | kfree(mr); |
931 | 930 | ||
932 | /* Don't stop cleanup, in case FW is unresponsive */ | 931 | /* Don't stop cleanup, in case FW is unresponsive */ |
diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c index 3fc7a4e901c3..27d90a84ea01 100644 --- a/drivers/infiniband/hw/qedr/verbs.c +++ b/drivers/infiniband/hw/qedr/verbs.c | |||
@@ -1572,12 +1572,10 @@ qedr_iwarp_populate_user_qp(struct qedr_dev *dev, | |||
1572 | 1572 | ||
1573 | static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp) | 1573 | static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp) |
1574 | { | 1574 | { |
1575 | if (qp->usq.umem) | 1575 | ib_umem_release(qp->usq.umem); |
1576 | ib_umem_release(qp->usq.umem); | ||
1577 | qp->usq.umem = NULL; | 1576 | qp->usq.umem = NULL; |
1578 | 1577 | ||
1579 | if (qp->urq.umem) | 1578 | ib_umem_release(qp->urq.umem); |
1580 | ib_umem_release(qp->urq.umem); | ||
1581 | qp->urq.umem = NULL; | 1579 | qp->urq.umem = NULL; |
1582 | } | 1580 | } |
1583 | 1581 | ||
@@ -2680,8 +2678,7 @@ int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) | |||
2680 | qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table); | 2678 | qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table); |
2681 | 2679 | ||
2682 | /* it could be user registered memory. */ | 2680 | /* it could be user registered memory. */ |
2683 | if (mr->umem) | 2681 | ib_umem_release(mr->umem); |
2684 | ib_umem_release(mr->umem); | ||
2685 | 2682 | ||
2686 | kfree(mr); | 2683 | kfree(mr); |
2687 | 2684 | ||
diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c index 38573fc0a9bf..7800e6930502 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c | |||
@@ -213,8 +213,7 @@ int pvrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, | |||
213 | err_page_dir: | 213 | err_page_dir: |
214 | pvrdma_page_dir_cleanup(dev, &cq->pdir); | 214 | pvrdma_page_dir_cleanup(dev, &cq->pdir); |
215 | err_umem: | 215 | err_umem: |
216 | if (!cq->is_kernel) | 216 | ib_umem_release(cq->umem); |
217 | ib_umem_release(cq->umem); | ||
218 | err_cq: | 217 | err_cq: |
219 | atomic_dec(&dev->num_cqs); | 218 | atomic_dec(&dev->num_cqs); |
220 | return ret; | 219 | return ret; |
@@ -226,8 +225,7 @@ static void pvrdma_free_cq(struct pvrdma_dev *dev, struct pvrdma_cq *cq) | |||
226 | complete(&cq->free); | 225 | complete(&cq->free); |
227 | wait_for_completion(&cq->free); | 226 | wait_for_completion(&cq->free); |
228 | 227 | ||
229 | if (!cq->is_kernel) | 228 | ib_umem_release(cq->umem); |
230 | ib_umem_release(cq->umem); | ||
231 | 229 | ||
232 | pvrdma_page_dir_cleanup(dev, &cq->pdir); | 230 | pvrdma_page_dir_cleanup(dev, &cq->pdir); |
233 | } | 231 | } |
diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c index 65dc47ffb8f3..f3a3d22ee8d7 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c | |||
@@ -290,8 +290,7 @@ int pvrdma_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) | |||
290 | "could not deregister mem region, error: %d\n", ret); | 290 | "could not deregister mem region, error: %d\n", ret); |
291 | 291 | ||
292 | pvrdma_page_dir_cleanup(dev, &mr->pdir); | 292 | pvrdma_page_dir_cleanup(dev, &mr->pdir); |
293 | if (mr->umem) | 293 | ib_umem_release(mr->umem); |
294 | ib_umem_release(mr->umem); | ||
295 | 294 | ||
296 | kfree(mr->pages); | 295 | kfree(mr->pages); |
297 | kfree(mr); | 296 | kfree(mr); |
diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c index 0eaaead5baec..bca6a58a442e 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c | |||
@@ -391,12 +391,8 @@ struct ib_qp *pvrdma_create_qp(struct ib_pd *pd, | |||
391 | err_pdir: | 391 | err_pdir: |
392 | pvrdma_page_dir_cleanup(dev, &qp->pdir); | 392 | pvrdma_page_dir_cleanup(dev, &qp->pdir); |
393 | err_umem: | 393 | err_umem: |
394 | if (!qp->is_kernel) { | 394 | ib_umem_release(qp->rumem); |
395 | if (qp->rumem) | 395 | ib_umem_release(qp->sumem); |
396 | ib_umem_release(qp->rumem); | ||
397 | if (qp->sumem) | ||
398 | ib_umem_release(qp->sumem); | ||
399 | } | ||
400 | err_qp: | 396 | err_qp: |
401 | kfree(qp); | 397 | kfree(qp); |
402 | atomic_dec(&dev->num_qps); | 398 | atomic_dec(&dev->num_qps); |
@@ -429,12 +425,8 @@ static void pvrdma_free_qp(struct pvrdma_qp *qp) | |||
429 | complete(&qp->free); | 425 | complete(&qp->free); |
430 | wait_for_completion(&qp->free); | 426 | wait_for_completion(&qp->free); |
431 | 427 | ||
432 | if (!qp->is_kernel) { | 428 | ib_umem_release(qp->rumem); |
433 | if (qp->rumem) | 429 | ib_umem_release(qp->sumem); |
434 | ib_umem_release(qp->rumem); | ||
435 | if (qp->sumem) | ||
436 | ib_umem_release(qp->sumem); | ||
437 | } | ||
438 | 430 | ||
439 | pvrdma_page_dir_cleanup(dev, &qp->pdir); | 431 | pvrdma_page_dir_cleanup(dev, &qp->pdir); |
440 | 432 | ||
diff --git a/drivers/infiniband/sw/rdmavt/mr.c b/drivers/infiniband/sw/rdmavt/mr.c index 54f3f9c27552..db800eb2b1f5 100644 --- a/drivers/infiniband/sw/rdmavt/mr.c +++ b/drivers/infiniband/sw/rdmavt/mr.c | |||
@@ -560,8 +560,7 @@ int rvt_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) | |||
560 | if (ret) | 560 | if (ret) |
561 | goto out; | 561 | goto out; |
562 | rvt_deinit_mregion(&mr->mr); | 562 | rvt_deinit_mregion(&mr->mr); |
563 | if (mr->umem) | 563 | ib_umem_release(mr->umem); |
564 | ib_umem_release(mr->umem); | ||
565 | kfree(mr); | 564 | kfree(mr); |
566 | out: | 565 | out: |
567 | return ret; | 566 | return ret; |
diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c index f501f72489d8..ea6a819b7167 100644 --- a/drivers/infiniband/sw/rxe/rxe_mr.c +++ b/drivers/infiniband/sw/rxe/rxe_mr.c | |||
@@ -96,8 +96,7 @@ void rxe_mem_cleanup(struct rxe_pool_entry *arg) | |||
96 | struct rxe_mem *mem = container_of(arg, typeof(*mem), pelem); | 96 | struct rxe_mem *mem = container_of(arg, typeof(*mem), pelem); |
97 | int i; | 97 | int i; |
98 | 98 | ||
99 | if (mem->umem) | 99 | ib_umem_release(mem->umem); |
100 | ib_umem_release(mem->umem); | ||
101 | 100 | ||
102 | if (mem->map) { | 101 | if (mem->map) { |
103 | for (i = 0; i < mem->num_map; i++) | 102 | for (i = 0; i < mem->num_map; i++) |