aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/core/umem.c3
-rw-r--r--drivers/infiniband/hw/bnxt_re/ib_verbs.c29
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_provider.c3
-rw-r--r--drivers/infiniband/hw/cxgb4/mem.c3
-rw-r--r--drivers/infiniband/hw/efa/efa_verbs.c2
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_cq.c8
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_hw_v1.c13
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_hw_v2.c2
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_mr.c4
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_qp.c5
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_srq.c14
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c3
-rw-r--r--drivers/infiniband/hw/mlx4/cq.c14
-rw-r--r--drivers/infiniband/hw/mlx4/qp.c7
-rw-r--r--drivers/infiniband/hw/mlx4/srq.c7
-rw-r--r--drivers/infiniband/hw/mlx5/cq.c20
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c13
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c9
-rw-r--r--drivers/infiniband/hw/mthca/mthca_provider.c3
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c3
-rw-r--r--drivers/infiniband/hw/qedr/verbs.c9
-rw-r--r--drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c6
-rw-r--r--drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c3
-rw-r--r--drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c16
-rw-r--r--drivers/infiniband/sw/rdmavt/mr.c3
-rw-r--r--drivers/infiniband/sw/rxe/rxe_mr.c3
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 */
362void ib_umem_release(struct ib_umem *umem) 362void 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,
1201qp_destroy: 1199qp_destroy:
1202 bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp); 1200 bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp);
1203free_umem: 1201free_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 }
1210fail: 1204fail:
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
1414fail: 1407fail:
1415 if (srq->umem) 1408 ib_umem_release(srq->umem);
1416 ib_umem_release(srq->umem);
1417exit: 1409exit:
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
2634c2fail: 2625c2fail:
2635 if (udata) 2626 ib_umem_release(cq->umem);
2636 ib_umem_release(cq->umem);
2637fail: 2627fail:
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, &params); 1513 err = efa_com_dereg_mr(&dev->edev, &params);
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
424err_mtt: 424err_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
940err_alloc_list: 940err_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
946err_db: 945err_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
382err_idx_mtt: 382err_idx_mtt:
383 if (udata) 383 ib_umem_release(srq->idx_que.umem);
384 ib_umem_release(srq->idx_que.umem);
385 384
386err_create_idx: 385err_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
394err_buf: 393err_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
422int hns_roce_init_srq_table(struct hns_roce_dev *hr_dev) 420int 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:
277err_mtt: 277err_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
285err_db: 284err_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
476out: 472out:
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
504static void dump_cqe(void *cqe) 500static 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
1209err_buf: 1209err_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
1215err_db: 1214err_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
206err_buf: 206err_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
212err_db: 211err_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
287void mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index) 286void 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
1128static void un_resize_user(struct mlx5_ib_cq *cq)
1129{
1130 ib_umem_release(cq->resize_umem);
1131}
1132
1133static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq, 1128static 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
1155static 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
1161static int copy_resize_cqes(struct mlx5_ib_cq *cq) 1150static 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
1340ex_resize: 1329ex_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 }
1345ex: 1335ex:
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
1509err: 1509err:
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
797static int create_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd, 796static 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
979err_umem: 978err_umem:
980 if (ubuffer->umem) 979 ib_umem_release(ubuffer->umem);
981 ib_umem_release(ubuffer->umem);
982 980
983err_bfreg: 981err_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
1573static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp) 1573static 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,
213err_page_dir: 213err_page_dir:
214 pvrdma_page_dir_cleanup(dev, &cq->pdir); 214 pvrdma_page_dir_cleanup(dev, &cq->pdir);
215err_umem: 215err_umem:
216 if (!cq->is_kernel) 216 ib_umem_release(cq->umem);
217 ib_umem_release(cq->umem);
218err_cq: 217err_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,
391err_pdir: 391err_pdir:
392 pvrdma_page_dir_cleanup(dev, &qp->pdir); 392 pvrdma_page_dir_cleanup(dev, &qp->pdir);
393err_umem: 393err_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 }
400err_qp: 396err_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);
566out: 565out:
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++)