summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/core/uverbs.h3
-rw-r--r--drivers/infiniband/core/uverbs_cmd.c7
-rw-r--r--drivers/infiniband/core/uverbs_std_types.c12
-rw-r--r--drivers/infiniband/core/uverbs_std_types_cq.c2
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_provider.c4
-rw-r--r--drivers/infiniband/hw/cxgb4/cq.c6
-rw-r--r--drivers/infiniband/hw/cxgb4/qp.c4
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_cq.c8
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_hw_v2.c23
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c7
-rw-r--r--drivers/infiniband/hw/mlx4/cq.c10
-rw-r--r--drivers/infiniband/hw/mlx4/qp.c32
-rw-r--r--drivers/infiniband/hw/mlx4/srq.c9
-rw-r--r--drivers/infiniband/hw/mlx5/cq.c21
-rw-r--r--drivers/infiniband/hw/mlx5/main.c5
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c32
-rw-r--r--drivers/infiniband/hw/mlx5/srq.c19
-rw-r--r--drivers/infiniband/hw/mthca/mthca_provider.c42
-rw-r--r--drivers/infiniband/hw/nes/nes_verbs.c16
-rw-r--r--drivers/infiniband/hw/qedr/verbs.c9
-rw-r--r--drivers/infiniband/hw/usnic/usnic_ib_verbs.c2
-rw-r--r--drivers/infiniband/hw/usnic/usnic_uiom.c3
-rw-r--r--drivers/infiniband/hw/usnic/usnic_uiom.h3
23 files changed, 177 insertions, 102 deletions
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h
index fa5ea6529333..0fc71ad42490 100644
--- a/drivers/infiniband/core/uverbs.h
+++ b/drivers/infiniband/core/uverbs.h
@@ -240,7 +240,8 @@ void ib_uverbs_srq_event_handler(struct ib_event *event, void *context_ptr);
240void ib_uverbs_event_handler(struct ib_event_handler *handler, 240void ib_uverbs_event_handler(struct ib_event_handler *handler,
241 struct ib_event *event); 241 struct ib_event *event);
242int ib_uverbs_dealloc_xrcd(struct ib_uobject *uobject, struct ib_xrcd *xrcd, 242int ib_uverbs_dealloc_xrcd(struct ib_uobject *uobject, struct ib_xrcd *xrcd,
243 enum rdma_remove_reason why, struct ib_udata *udata); 243 enum rdma_remove_reason why,
244 struct uverbs_attr_bundle *attrs);
244 245
245int uverbs_dealloc_mw(struct ib_mw *mw); 246int uverbs_dealloc_mw(struct ib_mw *mw);
246void ib_uverbs_detach_umcast(struct ib_qp *qp, 247void ib_uverbs_detach_umcast(struct ib_qp *qp,
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index fe63dfd5f1b6..da31dba33fc5 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -670,17 +670,18 @@ static int ib_uverbs_close_xrcd(struct uverbs_attr_bundle *attrs)
670} 670}
671 671
672int ib_uverbs_dealloc_xrcd(struct ib_uobject *uobject, struct ib_xrcd *xrcd, 672int ib_uverbs_dealloc_xrcd(struct ib_uobject *uobject, struct ib_xrcd *xrcd,
673 enum rdma_remove_reason why, struct ib_udata *udata) 673 enum rdma_remove_reason why,
674 struct uverbs_attr_bundle *attrs)
674{ 675{
675 struct inode *inode; 676 struct inode *inode;
676 int ret; 677 int ret;
677 struct ib_uverbs_device *dev = uobject->context->ufile->device; 678 struct ib_uverbs_device *dev = attrs->ufile->device;
678 679
679 inode = xrcd->inode; 680 inode = xrcd->inode;
680 if (inode && !atomic_dec_and_test(&xrcd->usecnt)) 681 if (inode && !atomic_dec_and_test(&xrcd->usecnt))
681 return 0; 682 return 0;
682 683
683 ret = ib_dealloc_xrcd(xrcd, udata); 684 ret = ib_dealloc_xrcd(xrcd, &attrs->driver_udata);
684 685
685 if (ib_is_destroy_retryable(ret, why, uobject)) { 686 if (ib_is_destroy_retryable(ret, why, uobject)) {
686 atomic_inc(&xrcd->usecnt); 687 atomic_inc(&xrcd->usecnt);
diff --git a/drivers/infiniband/core/uverbs_std_types.c b/drivers/infiniband/core/uverbs_std_types.c
index c625f590a8f0..35b2e2c640cc 100644
--- a/drivers/infiniband/core/uverbs_std_types.c
+++ b/drivers/infiniband/core/uverbs_std_types.c
@@ -105,7 +105,7 @@ static int uverbs_free_qp(struct ib_uobject *uobject,
105 if (uqp->uxrcd) 105 if (uqp->uxrcd)
106 atomic_dec(&uqp->uxrcd->refcnt); 106 atomic_dec(&uqp->uxrcd->refcnt);
107 107
108 ib_uverbs_release_uevent(uobject->context->ufile, &uqp->uevent); 108 ib_uverbs_release_uevent(attrs->ufile, &uqp->uevent);
109 return ret; 109 return ret;
110} 110}
111 111
@@ -138,7 +138,7 @@ static int uverbs_free_wq(struct ib_uobject *uobject,
138 if (ib_is_destroy_retryable(ret, why, uobject)) 138 if (ib_is_destroy_retryable(ret, why, uobject))
139 return ret; 139 return ret;
140 140
141 ib_uverbs_release_uevent(uobject->context->ufile, &uwq->uevent); 141 ib_uverbs_release_uevent(attrs->ufile, &uwq->uevent);
142 return ret; 142 return ret;
143} 143}
144 144
@@ -163,7 +163,7 @@ static int uverbs_free_srq(struct ib_uobject *uobject,
163 atomic_dec(&us->uxrcd->refcnt); 163 atomic_dec(&us->uxrcd->refcnt);
164 } 164 }
165 165
166 ib_uverbs_release_uevent(uobject->context->ufile, uevent); 166 ib_uverbs_release_uevent(attrs->ufile, uevent);
167 return ret; 167 return ret;
168} 168}
169 169
@@ -180,9 +180,9 @@ static int uverbs_free_xrcd(struct ib_uobject *uobject,
180 if (ret) 180 if (ret)
181 return ret; 181 return ret;
182 182
183 mutex_lock(&uobject->context->ufile->device->xrcd_tree_mutex); 183 mutex_lock(&attrs->ufile->device->xrcd_tree_mutex);
184 ret = ib_uverbs_dealloc_xrcd(uobject, xrcd, why, &attrs->driver_udata); 184 ret = ib_uverbs_dealloc_xrcd(uobject, xrcd, why, attrs);
185 mutex_unlock(&uobject->context->ufile->device->xrcd_tree_mutex); 185 mutex_unlock(&attrs->ufile->device->xrcd_tree_mutex);
186 186
187 return ret; 187 return ret;
188} 188}
diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infiniband/core/uverbs_std_types_cq.c
index f03506ece016..cde608c268ff 100644
--- a/drivers/infiniband/core/uverbs_std_types_cq.c
+++ b/drivers/infiniband/core/uverbs_std_types_cq.c
@@ -49,7 +49,7 @@ static int uverbs_free_cq(struct ib_uobject *uobject,
49 return ret; 49 return ret;
50 50
51 ib_uverbs_release_ucq( 51 ib_uverbs_release_ucq(
52 uobject->context->ufile, 52 attrs->ufile,
53 ev_queue ? container_of(ev_queue, 53 ev_queue ? container_of(ev_queue,
54 struct ib_uverbs_completion_event_file, 54 struct ib_uverbs_completion_event_file,
55 ev_queue) : 55 ev_queue) :
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index e10a56242998..bf07e93aeb94 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -760,8 +760,8 @@ static int iwch_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata)
760 atomic_dec(&qhp->refcnt); 760 atomic_dec(&qhp->refcnt);
761 wait_event(qhp->wait, !atomic_read(&qhp->refcnt)); 761 wait_event(qhp->wait, !atomic_read(&qhp->refcnt));
762 762
763 ucontext = ib_qp->uobject ? to_iwch_ucontext(ib_qp->uobject->context) 763 ucontext = rdma_udata_to_drv_context(udata, struct iwch_ucontext,
764 : NULL; 764 ibucontext);
765 cxio_destroy_qp(&rhp->rdev, &qhp->wq, 765 cxio_destroy_qp(&rhp->rdev, &qhp->wq,
766 ucontext ? &ucontext->uctx : &rhp->rdev.uctx); 766 ucontext ? &ucontext->uctx : &rhp->rdev.uctx);
767 767
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
index 562187f0c5af..571281888de0 100644
--- a/drivers/infiniband/hw/cxgb4/cq.c
+++ b/drivers/infiniband/hw/cxgb4/cq.c
@@ -30,6 +30,8 @@
30 * SOFTWARE. 30 * SOFTWARE.
31 */ 31 */
32 32
33#include <rdma/uverbs_ioctl.h>
34
33#include "iw_cxgb4.h" 35#include "iw_cxgb4.h"
34 36
35static int destroy_cq(struct c4iw_rdev *rdev, struct t4_cq *cq, 37static int destroy_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
@@ -980,8 +982,8 @@ int c4iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
980 atomic_dec(&chp->refcnt); 982 atomic_dec(&chp->refcnt);
981 wait_event(chp->wait, !atomic_read(&chp->refcnt)); 983 wait_event(chp->wait, !atomic_read(&chp->refcnt));
982 984
983 ucontext = ib_cq->uobject ? to_c4iw_ucontext(ib_cq->uobject->context) 985 ucontext = rdma_udata_to_drv_context(udata, struct c4iw_ucontext,
984 : NULL; 986 ibucontext);
985 destroy_cq(&chp->rhp->rdev, &chp->cq, 987 destroy_cq(&chp->rhp->rdev, &chp->cq,
986 ucontext ? &ucontext->uctx : &chp->cq.rdev->uctx, 988 ucontext ? &ucontext->uctx : &chp->cq.rdev->uctx,
987 chp->destroy_skb, chp->wr_waitp); 989 chp->destroy_skb, chp->wr_waitp);
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
index 76e6544cf0b9..777231496cc6 100644
--- a/drivers/infiniband/hw/cxgb4/qp.c
+++ b/drivers/infiniband/hw/cxgb4/qp.c
@@ -2838,8 +2838,8 @@ int c4iw_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
2838 pr_debug("%s id %d\n", __func__, srq->wq.qid); 2838 pr_debug("%s id %d\n", __func__, srq->wq.qid);
2839 2839
2840 xa_erase_irq(&rhp->qps, srq->wq.qid); 2840 xa_erase_irq(&rhp->qps, srq->wq.qid);
2841 ucontext = ibsrq->uobject ? 2841 ucontext = rdma_udata_to_drv_context(udata, struct c4iw_ucontext,
2842 to_c4iw_ucontext(ibsrq->uobject->context) : NULL; 2842 ibucontext);
2843 free_srq_queue(srq, ucontext ? &ucontext->uctx : &rhp->rdev.uctx, 2843 free_srq_queue(srq, ucontext ? &ucontext->uctx : &rhp->rdev.uctx,
2844 srq->wr_waitp); 2844 srq->wr_waitp);
2845 c4iw_free_srq_idx(&rhp->rdev, srq->idx); 2845 c4iw_free_srq_idx(&rhp->rdev, srq->idx);
diff --git a/drivers/infiniband/hw/hns/hns_roce_cq.c b/drivers/infiniband/hw/hns/hns_roce_cq.c
index a4e95a310c16..305c362ef5c6 100644
--- a/drivers/infiniband/hw/hns/hns_roce_cq.c
+++ b/drivers/infiniband/hw/hns/hns_roce_cq.c
@@ -32,6 +32,7 @@
32 32
33#include <linux/platform_device.h> 33#include <linux/platform_device.h>
34#include <rdma/ib_umem.h> 34#include <rdma/ib_umem.h>
35#include <rdma/uverbs_ioctl.h>
35#include "hns_roce_device.h" 36#include "hns_roce_device.h"
36#include "hns_roce_cmd.h" 37#include "hns_roce_cmd.h"
37#include "hns_roce_hem.h" 38#include "hns_roce_hem.h"
@@ -456,12 +457,15 @@ int hns_roce_ib_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
456 hns_roce_free_cq(hr_dev, hr_cq); 457 hns_roce_free_cq(hr_dev, hr_cq);
457 hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); 458 hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt);
458 459
459 if (ib_cq->uobject) { 460 if (udata) {
460 ib_umem_release(hr_cq->umem); 461 ib_umem_release(hr_cq->umem);
461 462
462 if (hr_cq->db_en == 1) 463 if (hr_cq->db_en == 1)
463 hns_roce_db_unmap_user( 464 hns_roce_db_unmap_user(
464 to_hr_ucontext(ib_cq->uobject->context), 465 rdma_udata_to_drv_context(
466 udata,
467 struct hns_roce_ucontext,
468 ibucontext),
465 &hr_cq->db); 469 &hr_cq->db);
466 } else { 470 } else {
467 /* Free the buff of stored cq */ 471 /* Free the buff of stored cq */
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index 30b00240b7c8..b3cda5803c02 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -38,6 +38,7 @@
38#include <net/addrconf.h> 38#include <net/addrconf.h>
39#include <rdma/ib_addr.h> 39#include <rdma/ib_addr.h>
40#include <rdma/ib_umem.h> 40#include <rdma/ib_umem.h>
41#include <rdma/uverbs_ioctl.h>
41 42
42#include "hnae3.h" 43#include "hnae3.h"
43#include "hns_roce_common.h" 44#include "hns_roce_common.h"
@@ -4442,7 +4443,7 @@ out:
4442 4443
4443static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev, 4444static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
4444 struct hns_roce_qp *hr_qp, 4445 struct hns_roce_qp *hr_qp,
4445 bool is_user) 4446 struct ib_udata *udata)
4446{ 4447{
4447 struct hns_roce_cq *send_cq, *recv_cq; 4448 struct hns_roce_cq *send_cq, *recv_cq;
4448 struct device *dev = hr_dev->dev; 4449 struct device *dev = hr_dev->dev;
@@ -4464,7 +4465,7 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
4464 4465
4465 hns_roce_lock_cqs(send_cq, recv_cq); 4466 hns_roce_lock_cqs(send_cq, recv_cq);
4466 4467
4467 if (!is_user) { 4468 if (!udata) {
4468 __hns_roce_v2_cq_clean(recv_cq, hr_qp->qpn, hr_qp->ibqp.srq ? 4469 __hns_roce_v2_cq_clean(recv_cq, hr_qp->qpn, hr_qp->ibqp.srq ?
4469 to_hr_srq(hr_qp->ibqp.srq) : NULL); 4470 to_hr_srq(hr_qp->ibqp.srq) : NULL);
4470 if (send_cq != recv_cq) 4471 if (send_cq != recv_cq)
@@ -4485,16 +4486,18 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
4485 4486
4486 hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt); 4487 hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt);
4487 4488
4488 if (is_user) { 4489 if (udata) {
4490 struct hns_roce_ucontext *context =
4491 rdma_udata_to_drv_context(
4492 udata,
4493 struct hns_roce_ucontext,
4494 ibucontext);
4495
4489 if (hr_qp->sq.wqe_cnt && (hr_qp->sdb_en == 1)) 4496 if (hr_qp->sq.wqe_cnt && (hr_qp->sdb_en == 1))
4490 hns_roce_db_unmap_user( 4497 hns_roce_db_unmap_user(context, &hr_qp->sdb);
4491 to_hr_ucontext(hr_qp->ibqp.uobject->context),
4492 &hr_qp->sdb);
4493 4498
4494 if (hr_qp->rq.wqe_cnt && (hr_qp->rdb_en == 1)) 4499 if (hr_qp->rq.wqe_cnt && (hr_qp->rdb_en == 1))
4495 hns_roce_db_unmap_user( 4500 hns_roce_db_unmap_user(context, &hr_qp->rdb);
4496 to_hr_ucontext(hr_qp->ibqp.uobject->context),
4497 &hr_qp->rdb);
4498 ib_umem_release(hr_qp->umem); 4501 ib_umem_release(hr_qp->umem);
4499 } else { 4502 } else {
4500 kfree(hr_qp->sq.wrid); 4503 kfree(hr_qp->sq.wrid);
@@ -4519,7 +4522,7 @@ static int hns_roce_v2_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
4519 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 4522 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4520 int ret; 4523 int ret;
4521 4524
4522 ret = hns_roce_v2_destroy_qp_common(hr_dev, hr_qp, ibqp->uobject); 4525 ret = hns_roce_v2_destroy_qp_common(hr_dev, hr_qp, udata);
4523 if (ret) { 4526 if (ret) {
4524 dev_err(hr_dev->dev, "Destroy qp failed(%d)\n", ret); 4527 dev_err(hr_dev->dev, "Destroy qp failed(%d)\n", ret);
4525 return ret; 4528 return ret;
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
index fd2d7426c832..fcb9e2448a49 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
@@ -2060,9 +2060,12 @@ static int i40iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
2060 if (iwmr->type != IW_MEMREG_TYPE_MEM) { 2060 if (iwmr->type != IW_MEMREG_TYPE_MEM) {
2061 /* region is released. only test for userness. */ 2061 /* region is released. only test for userness. */
2062 if (iwmr->region) { 2062 if (iwmr->region) {
2063 struct i40iw_ucontext *ucontext; 2063 struct i40iw_ucontext *ucontext =
2064 rdma_udata_to_drv_context(
2065 udata,
2066 struct i40iw_ucontext,
2067 ibucontext);
2064 2068
2065 ucontext = to_ucontext(ibpd->uobject->context);
2066 i40iw_del_memlist(iwmr, ucontext); 2069 i40iw_del_memlist(iwmr, ucontext);
2067 } 2070 }
2068 if (iwpbl->pbl_allocated && iwmr->type != IW_MEMREG_TYPE_QP) 2071 if (iwpbl->pbl_allocated && iwmr->type != IW_MEMREG_TYPE_QP)
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 0b730737fb25..5403a1ff7cc2 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -38,6 +38,7 @@
38 38
39#include "mlx4_ib.h" 39#include "mlx4_ib.h"
40#include <rdma/mlx4-abi.h> 40#include <rdma/mlx4-abi.h>
41#include <rdma/uverbs_ioctl.h>
41 42
42static void mlx4_ib_cq_comp(struct mlx4_cq *cq) 43static void mlx4_ib_cq_comp(struct mlx4_cq *cq)
43{ 44{
@@ -493,8 +494,13 @@ int mlx4_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
493 mlx4_cq_free(dev->dev, &mcq->mcq); 494 mlx4_cq_free(dev->dev, &mcq->mcq);
494 mlx4_mtt_cleanup(dev->dev, &mcq->buf.mtt); 495 mlx4_mtt_cleanup(dev->dev, &mcq->buf.mtt);
495 496
496 if (cq->uobject) { 497 if (udata) {
497 mlx4_ib_db_unmap_user(to_mucontext(cq->uobject->context), &mcq->db); 498 mlx4_ib_db_unmap_user(
499 rdma_udata_to_drv_context(
500 udata,
501 struct mlx4_ib_ucontext,
502 ibucontext),
503 &mcq->db);
498 ib_umem_release(mcq->umem); 504 ib_umem_release(mcq->umem);
499 } else { 505 } else {
500 mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe); 506 mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe);
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index 25dfdcc90a05..99ceffe5cfec 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -1338,7 +1338,8 @@ static void destroy_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp)
1338} 1338}
1339 1339
1340static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp, 1340static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
1341 enum mlx4_ib_source_type src, bool is_user) 1341 enum mlx4_ib_source_type src,
1342 struct ib_udata *udata)
1342{ 1343{
1343 struct mlx4_ib_cq *send_cq, *recv_cq; 1344 struct mlx4_ib_cq *send_cq, *recv_cq;
1344 unsigned long flags; 1345 unsigned long flags;
@@ -1380,7 +1381,7 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
1380 list_del(&qp->qps_list); 1381 list_del(&qp->qps_list);
1381 list_del(&qp->cq_send_list); 1382 list_del(&qp->cq_send_list);
1382 list_del(&qp->cq_recv_list); 1383 list_del(&qp->cq_recv_list);
1383 if (!is_user) { 1384 if (!udata) {
1384 __mlx4_ib_cq_clean(recv_cq, qp->mqp.qpn, 1385 __mlx4_ib_cq_clean(recv_cq, qp->mqp.qpn,
1385 qp->ibqp.srq ? to_msrq(qp->ibqp.srq): NULL); 1386 qp->ibqp.srq ? to_msrq(qp->ibqp.srq): NULL);
1386 if (send_cq != recv_cq) 1387 if (send_cq != recv_cq)
@@ -1398,19 +1399,26 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
1398 if (qp->flags & MLX4_IB_QP_NETIF) 1399 if (qp->flags & MLX4_IB_QP_NETIF)
1399 mlx4_ib_steer_qp_free(dev, qp->mqp.qpn, 1); 1400 mlx4_ib_steer_qp_free(dev, qp->mqp.qpn, 1);
1400 else if (src == MLX4_IB_RWQ_SRC) 1401 else if (src == MLX4_IB_RWQ_SRC)
1401 mlx4_ib_release_wqn(to_mucontext( 1402 mlx4_ib_release_wqn(
1402 qp->ibwq.uobject->context), qp, 1); 1403 rdma_udata_to_drv_context(
1404 udata,
1405 struct mlx4_ib_ucontext,
1406 ibucontext),
1407 qp, 1);
1403 else 1408 else
1404 mlx4_qp_release_range(dev->dev, qp->mqp.qpn, 1); 1409 mlx4_qp_release_range(dev->dev, qp->mqp.qpn, 1);
1405 } 1410 }
1406 1411
1407 mlx4_mtt_cleanup(dev->dev, &qp->mtt); 1412 mlx4_mtt_cleanup(dev->dev, &qp->mtt);
1408 1413
1409 if (is_user) { 1414 if (udata) {
1410 if (qp->rq.wqe_cnt) { 1415 if (qp->rq.wqe_cnt) {
1411 struct mlx4_ib_ucontext *mcontext = !src ? 1416 struct mlx4_ib_ucontext *mcontext =
1412 to_mucontext(qp->ibqp.uobject->context) : 1417 rdma_udata_to_drv_context(
1413 to_mucontext(qp->ibwq.uobject->context); 1418 udata,
1419 struct mlx4_ib_ucontext,
1420 ibucontext);
1421
1414 mlx4_ib_db_unmap_user(mcontext, &qp->db); 1422 mlx4_ib_db_unmap_user(mcontext, &qp->db);
1415 } 1423 }
1416 ib_umem_release(qp->umem); 1424 ib_umem_release(qp->umem);
@@ -1594,7 +1602,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd,
1594 return ibqp; 1602 return ibqp;
1595} 1603}
1596 1604
1597static int _mlx4_ib_destroy_qp(struct ib_qp *qp) 1605static int _mlx4_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
1598{ 1606{
1599 struct mlx4_ib_dev *dev = to_mdev(qp->device); 1607 struct mlx4_ib_dev *dev = to_mdev(qp->device);
1600 struct mlx4_ib_qp *mqp = to_mqp(qp); 1608 struct mlx4_ib_qp *mqp = to_mqp(qp);
@@ -1615,7 +1623,7 @@ static int _mlx4_ib_destroy_qp(struct ib_qp *qp)
1615 if (qp->rwq_ind_tbl) { 1623 if (qp->rwq_ind_tbl) {
1616 destroy_qp_rss(dev, mqp); 1624 destroy_qp_rss(dev, mqp);
1617 } else { 1625 } else {
1618 destroy_qp_common(dev, mqp, MLX4_IB_QP_SRC, qp->uobject); 1626 destroy_qp_common(dev, mqp, MLX4_IB_QP_SRC, udata);
1619 } 1627 }
1620 1628
1621 if (is_sqp(dev, mqp)) 1629 if (is_sqp(dev, mqp))
@@ -1637,7 +1645,7 @@ int mlx4_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
1637 ib_destroy_qp(sqp->roce_v2_gsi); 1645 ib_destroy_qp(sqp->roce_v2_gsi);
1638 } 1646 }
1639 1647
1640 return _mlx4_ib_destroy_qp(qp); 1648 return _mlx4_ib_destroy_qp(qp, udata);
1641} 1649}
1642 1650
1643static int to_mlx4_st(struct mlx4_ib_dev *dev, enum mlx4_ib_qp_type type) 1651static int to_mlx4_st(struct mlx4_ib_dev *dev, enum mlx4_ib_qp_type type)
@@ -4252,7 +4260,7 @@ int mlx4_ib_destroy_wq(struct ib_wq *ibwq, struct ib_udata *udata)
4252 if (qp->counter_index) 4260 if (qp->counter_index)
4253 mlx4_ib_free_qp_counter(dev, qp); 4261 mlx4_ib_free_qp_counter(dev, qp);
4254 4262
4255 destroy_qp_common(dev, qp, MLX4_IB_RWQ_SRC, 1); 4263 destroy_qp_common(dev, qp, MLX4_IB_RWQ_SRC, udata);
4256 4264
4257 kfree(qp); 4265 kfree(qp);
4258 4266
diff --git a/drivers/infiniband/hw/mlx4/srq.c b/drivers/infiniband/hw/mlx4/srq.c
index b51f632f3f7d..2a20205d1662 100644
--- a/drivers/infiniband/hw/mlx4/srq.c
+++ b/drivers/infiniband/hw/mlx4/srq.c
@@ -280,8 +280,13 @@ int mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
280 mlx4_srq_free(dev->dev, &msrq->msrq); 280 mlx4_srq_free(dev->dev, &msrq->msrq);
281 mlx4_mtt_cleanup(dev->dev, &msrq->mtt); 281 mlx4_mtt_cleanup(dev->dev, &msrq->mtt);
282 282
283 if (srq->uobject) { 283 if (udata) {
284 mlx4_ib_db_unmap_user(to_mucontext(srq->uobject->context), &msrq->db); 284 mlx4_ib_db_unmap_user(
285 rdma_udata_to_drv_context(
286 udata,
287 struct mlx4_ib_ucontext,
288 ibucontext),
289 &msrq->db);
285 ib_umem_release(msrq->umem); 290 ib_umem_release(msrq->umem);
286 } else { 291 } else {
287 kvfree(msrq->wrid); 292 kvfree(msrq->wrid);
diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c
index 5d238a8ee132..5bed098ccdef 100644
--- a/drivers/infiniband/hw/mlx5/cq.c
+++ b/drivers/infiniband/hw/mlx5/cq.c
@@ -796,9 +796,12 @@ err_umem:
796 return err; 796 return err;
797} 797}
798 798
799static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_ucontext *context) 799static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_udata *udata)
800{ 800{
801 mlx5_ib_db_unmap_user(to_mucontext(context), &cq->db); 801 struct mlx5_ib_ucontext *context = rdma_udata_to_drv_context(
802 udata, struct mlx5_ib_ucontext, ibucontext);
803
804 mlx5_ib_db_unmap_user(context, &cq->db);
802 ib_umem_release(cq->buf.umem); 805 ib_umem_release(cq->buf.umem);
803} 806}
804 807
@@ -923,7 +926,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
923 INIT_LIST_HEAD(&cq->list_send_qp); 926 INIT_LIST_HEAD(&cq->list_send_qp);
924 INIT_LIST_HEAD(&cq->list_recv_qp); 927 INIT_LIST_HEAD(&cq->list_recv_qp);
925 928
926 if (context) { 929 if (udata) {
927 err = create_cq_user(dev, udata, context, cq, entries, 930 err = create_cq_user(dev, udata, context, cq, entries,
928 &cqb, &cqe_size, &index, &inlen); 931 &cqb, &cqe_size, &index, &inlen);
929 if (err) 932 if (err)
@@ -985,8 +988,8 @@ err_cmd:
985 988
986err_cqb: 989err_cqb:
987 kvfree(cqb); 990 kvfree(cqb);
988 if (context) 991 if (udata)
989 destroy_cq_user(cq, context); 992 destroy_cq_user(cq, udata);
990 else 993 else
991 destroy_cq_kernel(dev, cq); 994 destroy_cq_kernel(dev, cq);
992 995
@@ -1000,14 +1003,10 @@ int mlx5_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
1000{ 1003{
1001 struct mlx5_ib_dev *dev = to_mdev(cq->device); 1004 struct mlx5_ib_dev *dev = to_mdev(cq->device);
1002 struct mlx5_ib_cq *mcq = to_mcq(cq); 1005 struct mlx5_ib_cq *mcq = to_mcq(cq);
1003 struct ib_ucontext *context = NULL;
1004
1005 if (cq->uobject)
1006 context = cq->uobject->context;
1007 1006
1008 mlx5_core_destroy_cq(dev->mdev, &mcq->mcq); 1007 mlx5_core_destroy_cq(dev->mdev, &mcq->mcq);
1009 if (context) 1008 if (udata)
1010 destroy_cq_user(mcq, context); 1009 destroy_cq_user(mcq, udata);
1011 else 1010 else
1012 destroy_cq_kernel(dev, mcq); 1011 destroy_cq_kernel(dev, mcq);
1013 1012
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 468544819c79..769a5952a0f6 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -2329,7 +2329,10 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
2329 page_idx = (dm->dev_addr - pci_resource_start(memic->dev->pdev, 0) - 2329 page_idx = (dm->dev_addr - pci_resource_start(memic->dev->pdev, 0) -
2330 MLX5_CAP64_DEV_MEM(memic->dev, memic_bar_start_addr)) >> 2330 MLX5_CAP64_DEV_MEM(memic->dev, memic_bar_start_addr)) >>
2331 PAGE_SHIFT; 2331 PAGE_SHIFT;
2332 bitmap_clear(to_mucontext(ibdm->uobject->context)->dm_pages, 2332 bitmap_clear(rdma_udata_to_drv_context(
2333 &attrs->driver_udata,
2334 struct mlx5_ib_ucontext,
2335 ibucontext)->dm_pages,
2333 page_idx, 2336 page_idx,
2334 DIV_ROUND_UP(act_size, PAGE_SIZE)); 2337 DIV_ROUND_UP(act_size, PAGE_SIZE));
2335 2338
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index cd62c909b7eb..940ac1caa590 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -777,14 +777,17 @@ err_umem:
777} 777}
778 778
779static void destroy_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd, 779static void destroy_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd,
780 struct mlx5_ib_rwq *rwq) 780 struct mlx5_ib_rwq *rwq, struct ib_udata *udata)
781{ 781{
782 struct mlx5_ib_ucontext *context; 782 struct mlx5_ib_ucontext *context =
783 rdma_udata_to_drv_context(
784 udata,
785 struct mlx5_ib_ucontext,
786 ibucontext);
783 787
784 if (rwq->create_flags & MLX5_IB_WQ_FLAGS_DELAY_DROP) 788 if (rwq->create_flags & MLX5_IB_WQ_FLAGS_DELAY_DROP)
785 atomic_dec(&dev->delay_drop.rqs_cnt); 789 atomic_dec(&dev->delay_drop.rqs_cnt);
786 790
787 context = to_mucontext(pd->uobject->context);
788 mlx5_ib_db_unmap_user(context, &rwq->db); 791 mlx5_ib_db_unmap_user(context, &rwq->db);
789 if (rwq->umem) 792 if (rwq->umem)
790 ib_umem_release(rwq->umem); 793 ib_umem_release(rwq->umem);
@@ -983,11 +986,15 @@ err_bfreg:
983} 986}
984 987
985static void destroy_qp_user(struct mlx5_ib_dev *dev, struct ib_pd *pd, 988static void destroy_qp_user(struct mlx5_ib_dev *dev, struct ib_pd *pd,
986 struct mlx5_ib_qp *qp, struct mlx5_ib_qp_base *base) 989 struct mlx5_ib_qp *qp, struct mlx5_ib_qp_base *base,
990 struct ib_udata *udata)
987{ 991{
988 struct mlx5_ib_ucontext *context; 992 struct mlx5_ib_ucontext *context =
993 rdma_udata_to_drv_context(
994 udata,
995 struct mlx5_ib_ucontext,
996 ibucontext);
989 997
990 context = to_mucontext(pd->uobject->context);
991 mlx5_ib_db_unmap_user(context, &qp->db); 998 mlx5_ib_db_unmap_user(context, &qp->db);
992 if (base->ubuffer.umem) 999 if (base->ubuffer.umem)
993 ib_umem_release(base->ubuffer.umem); 1000 ib_umem_release(base->ubuffer.umem);
@@ -2284,7 +2291,7 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
2284 2291
2285err_create: 2292err_create:
2286 if (qp->create_type == MLX5_QP_USER) 2293 if (qp->create_type == MLX5_QP_USER)
2287 destroy_qp_user(dev, pd, qp, base); 2294 destroy_qp_user(dev, pd, qp, base, udata);
2288 else if (qp->create_type == MLX5_QP_KERNEL) 2295 else if (qp->create_type == MLX5_QP_KERNEL)
2289 destroy_qp_kernel(dev, qp); 2296 destroy_qp_kernel(dev, qp);
2290 2297
@@ -2395,7 +2402,8 @@ static int modify_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
2395 const struct mlx5_modify_raw_qp_param *raw_qp_param, 2402 const struct mlx5_modify_raw_qp_param *raw_qp_param,
2396 u8 lag_tx_affinity); 2403 u8 lag_tx_affinity);
2397 2404
2398static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp) 2405static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
2406 struct ib_udata *udata)
2399{ 2407{
2400 struct mlx5_ib_cq *send_cq, *recv_cq; 2408 struct mlx5_ib_cq *send_cq, *recv_cq;
2401 struct mlx5_ib_qp_base *base; 2409 struct mlx5_ib_qp_base *base;
@@ -2466,7 +2474,7 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp)
2466 if (qp->create_type == MLX5_QP_KERNEL) 2474 if (qp->create_type == MLX5_QP_KERNEL)
2467 destroy_qp_kernel(dev, qp); 2475 destroy_qp_kernel(dev, qp);
2468 else if (qp->create_type == MLX5_QP_USER) 2476 else if (qp->create_type == MLX5_QP_USER)
2469 destroy_qp_user(dev, &get_pd(qp)->ibpd, qp, base); 2477 destroy_qp_user(dev, &get_pd(qp)->ibpd, qp, base, udata);
2470} 2478}
2471 2479
2472static const char *ib_qp_type_str(enum ib_qp_type type) 2480static const char *ib_qp_type_str(enum ib_qp_type type)
@@ -2743,7 +2751,7 @@ int mlx5_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
2743 if (mqp->qp_sub_type == MLX5_IB_QPT_DCT) 2751 if (mqp->qp_sub_type == MLX5_IB_QPT_DCT)
2744 return mlx5_ib_destroy_dct(mqp); 2752 return mlx5_ib_destroy_dct(mqp);
2745 2753
2746 destroy_qp_common(dev, mqp); 2754 destroy_qp_common(dev, mqp, udata);
2747 2755
2748 kfree(mqp); 2756 kfree(mqp);
2749 2757
@@ -5959,7 +5967,7 @@ struct ib_wq *mlx5_ib_create_wq(struct ib_pd *pd,
5959err_copy: 5967err_copy:
5960 mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp); 5968 mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp);
5961err_user_rq: 5969err_user_rq:
5962 destroy_user_rq(dev, pd, rwq); 5970 destroy_user_rq(dev, pd, rwq, udata);
5963err: 5971err:
5964 kfree(rwq); 5972 kfree(rwq);
5965 return ERR_PTR(err); 5973 return ERR_PTR(err);
@@ -5971,7 +5979,7 @@ int mlx5_ib_destroy_wq(struct ib_wq *wq, struct ib_udata *udata)
5971 struct mlx5_ib_rwq *rwq = to_mrwq(wq); 5979 struct mlx5_ib_rwq *rwq = to_mrwq(wq);
5972 5980
5973 mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp); 5981 mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp);
5974 destroy_user_rq(dev, wq->pd, rwq); 5982 destroy_user_rq(dev, wq->pd, rwq, udata);
5975 kfree(rwq); 5983 kfree(rwq);
5976 5984
5977 return 0; 5985 return 0;
diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c
index bc1ca6bcea43..2e389f3444c6 100644
--- a/drivers/infiniband/hw/mlx5/srq.c
+++ b/drivers/infiniband/hw/mlx5/srq.c
@@ -194,9 +194,15 @@ err_db:
194 return err; 194 return err;
195} 195}
196 196
197static void destroy_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq) 197static void destroy_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
198 struct ib_udata *udata)
198{ 199{
199 mlx5_ib_db_unmap_user(to_mucontext(pd->uobject->context), &srq->db); 200 mlx5_ib_db_unmap_user(
201 rdma_udata_to_drv_context(
202 udata,
203 struct mlx5_ib_ucontext,
204 ibucontext),
205 &srq->db);
200 ib_umem_release(srq->umem); 206 ib_umem_release(srq->umem);
201} 207}
202 208
@@ -327,7 +333,7 @@ err_core:
327 333
328err_usr_kern_srq: 334err_usr_kern_srq:
329 if (udata) 335 if (udata)
330 destroy_srq_user(pd, srq); 336 destroy_srq_user(pd, srq, udata);
331 else 337 else
332 destroy_srq_kernel(dev, srq); 338 destroy_srq_kernel(dev, srq);
333 339
@@ -395,7 +401,12 @@ int mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
395 mlx5_cmd_destroy_srq(dev, &msrq->msrq); 401 mlx5_cmd_destroy_srq(dev, &msrq->msrq);
396 402
397 if (srq->uobject) { 403 if (srq->uobject) {
398 mlx5_ib_db_unmap_user(to_mucontext(srq->uobject->context), &msrq->db); 404 mlx5_ib_db_unmap_user(
405 rdma_udata_to_drv_context(
406 udata,
407 struct mlx5_ib_ucontext,
408 ibucontext),
409 &msrq->db);
399 ib_umem_release(msrq->umem); 410 ib_umem_release(msrq->umem);
400 } else { 411 } else {
401 destroy_srq_kernel(dev, msrq); 412 destroy_srq_kernel(dev, msrq);
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c
index 872f0ad556a7..9e4efd58c119 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -479,10 +479,12 @@ err_free:
479 479
480static int mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata) 480static int mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
481{ 481{
482 struct mthca_ucontext *context; 482 if (udata) {
483 483 struct mthca_ucontext *context =
484 if (srq->uobject) { 484 rdma_udata_to_drv_context(
485 context = to_mucontext(srq->uobject->context); 485 udata,
486 struct mthca_ucontext,
487 ibucontext);
486 488
487 mthca_unmap_user_db(to_mdev(srq->device), &context->uar, 489 mthca_unmap_user_db(to_mdev(srq->device), &context->uar,
488 context->db_tab, to_msrq(srq)->db_index); 490 context->db_tab, to_msrq(srq)->db_index);
@@ -609,14 +611,20 @@ static struct ib_qp *mthca_create_qp(struct ib_pd *pd,
609 611
610static int mthca_destroy_qp(struct ib_qp *qp, struct ib_udata *udata) 612static int mthca_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
611{ 613{
612 if (qp->uobject) { 614 if (udata) {
615 struct mthca_ucontext *context =
616 rdma_udata_to_drv_context(
617 udata,
618 struct mthca_ucontext,
619 ibucontext);
620
613 mthca_unmap_user_db(to_mdev(qp->device), 621 mthca_unmap_user_db(to_mdev(qp->device),
614 &to_mucontext(qp->uobject->context)->uar, 622 &context->uar,
615 to_mucontext(qp->uobject->context)->db_tab, 623 context->db_tab,
616 to_mqp(qp)->sq.db_index); 624 to_mqp(qp)->sq.db_index);
617 mthca_unmap_user_db(to_mdev(qp->device), 625 mthca_unmap_user_db(to_mdev(qp->device),
618 &to_mucontext(qp->uobject->context)->uar, 626 &context->uar,
619 to_mucontext(qp->uobject->context)->db_tab, 627 context->db_tab,
620 to_mqp(qp)->rq.db_index); 628 to_mqp(qp)->rq.db_index);
621 } 629 }
622 mthca_free_qp(to_mdev(qp->device), to_mqp(qp)); 630 mthca_free_qp(to_mdev(qp->device), to_mqp(qp));
@@ -829,14 +837,20 @@ out:
829 837
830static int mthca_destroy_cq(struct ib_cq *cq, struct ib_udata *udata) 838static int mthca_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
831{ 839{
832 if (cq->uobject) { 840 if (udata) {
841 struct mthca_ucontext *context =
842 rdma_udata_to_drv_context(
843 udata,
844 struct mthca_ucontext,
845 ibucontext);
846
833 mthca_unmap_user_db(to_mdev(cq->device), 847 mthca_unmap_user_db(to_mdev(cq->device),
834 &to_mucontext(cq->uobject->context)->uar, 848 &context->uar,
835 to_mucontext(cq->uobject->context)->db_tab, 849 context->db_tab,
836 to_mcq(cq)->arm_db_index); 850 to_mcq(cq)->arm_db_index);
837 mthca_unmap_user_db(to_mdev(cq->device), 851 mthca_unmap_user_db(to_mdev(cq->device),
838 &to_mucontext(cq->uobject->context)->uar, 852 &context->uar,
839 to_mucontext(cq->uobject->context)->db_tab, 853 context->db_tab,
840 to_mcq(cq)->set_ci_db_index); 854 to_mcq(cq)->set_ci_db_index);
841 } 855 }
842 mthca_free_cq(to_mdev(cq->device), to_mcq(cq)); 856 mthca_free_cq(to_mdev(cq->device), to_mcq(cq));
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index 4b7855c7dacf..244255b1e940 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -707,8 +707,12 @@ static void nes_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
707 struct nes_device *nesdev = nesvnic->nesdev; 707 struct nes_device *nesdev = nesvnic->nesdev;
708 struct nes_adapter *nesadapter = nesdev->nesadapter; 708 struct nes_adapter *nesadapter = nesdev->nesadapter;
709 709
710 if ((ibpd->uobject) && (ibpd->uobject->context)) { 710 if (udata) {
711 nesucontext = to_nesucontext(ibpd->uobject->context); 711 nesucontext =
712 rdma_udata_to_drv_context(
713 udata,
714 struct nes_ucontext,
715 ibucontext);
712 nes_debug(NES_DBG_PD, "Clearing bit %u from allocated doorbells\n", 716 nes_debug(NES_DBG_PD, "Clearing bit %u from allocated doorbells\n",
713 nespd->mmap_db_index); 717 nespd->mmap_db_index);
714 clear_bit(nespd->mmap_db_index, nesucontext->allocated_doorbells); 718 clear_bit(nespd->mmap_db_index, nesucontext->allocated_doorbells);
@@ -1337,8 +1341,12 @@ static int nes_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
1337 } 1341 }
1338 1342
1339 if (nesqp->user_mode) { 1343 if (nesqp->user_mode) {
1340 if ((ibqp->uobject)&&(ibqp->uobject->context)) { 1344 if (udata) {
1341 nes_ucontext = to_nesucontext(ibqp->uobject->context); 1345 nes_ucontext =
1346 rdma_udata_to_drv_context(
1347 udata,
1348 struct nes_ucontext,
1349 ibucontext);
1342 clear_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs); 1350 clear_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
1343 nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = NULL; 1351 nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = NULL;
1344 if (nes_ucontext->first_free_wq > nesqp->mmap_sq_db_index) { 1352 if (nes_ucontext->first_free_wq > nesqp->mmap_sq_db_index) {
diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c
index 42755e7a10a8..4cd16ad16430 100644
--- a/drivers/infiniband/hw/qedr/verbs.c
+++ b/drivers/infiniband/hw/qedr/verbs.c
@@ -986,7 +986,7 @@ int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
986 986
987 dev->ops->common->chain_free(dev->cdev, &cq->pbl); 987 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
988 988
989 if (ibcq->uobject && ibcq->uobject->context) { 989 if (udata) {
990 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl); 990 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
991 ib_umem_release(cq->q.umem); 991 ib_umem_release(cq->q.umem);
992 } 992 }
@@ -2470,7 +2470,8 @@ err:
2470 return rc; 2470 return rc;
2471} 2471}
2472 2472
2473static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp) 2473static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp,
2474 struct ib_udata *udata)
2474{ 2475{
2475 int rc = 0; 2476 int rc = 0;
2476 2477
@@ -2480,7 +2481,7 @@ static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp)
2480 return rc; 2481 return rc;
2481 } 2482 }
2482 2483
2483 if (qp->ibqp.uobject && qp->ibqp.uobject->context) 2484 if (udata)
2484 qedr_cleanup_user(dev, qp); 2485 qedr_cleanup_user(dev, qp);
2485 else 2486 else
2486 qedr_cleanup_kernel(dev, qp); 2487 qedr_cleanup_kernel(dev, qp);
@@ -2532,7 +2533,7 @@ int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
2532 if (qp->qp_type == IB_QPT_GSI) 2533 if (qp->qp_type == IB_QPT_GSI)
2533 qedr_destroy_gsi_qp(dev); 2534 qedr_destroy_gsi_qp(dev);
2534 2535
2535 qedr_free_qp_resources(dev, qp); 2536 qedr_free_qp_resources(dev, qp, udata);
2536 2537
2537 if (atomic_dec_and_test(&qp->refcnt) && 2538 if (atomic_dec_and_test(&qp->refcnt) &&
2538 rdma_protocol_iwarp(&dev->ibdev, 1)) { 2539 rdma_protocol_iwarp(&dev->ibdev, 1)) {
diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c
index cdb6357337c0..e282eea8ecce 100644
--- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c
+++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c
@@ -648,7 +648,7 @@ int usnic_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
648 648
649 usnic_dbg("va 0x%lx length 0x%zx\n", mr->umem->va, mr->umem->length); 649 usnic_dbg("va 0x%lx length 0x%zx\n", mr->umem->va, mr->umem->length);
650 650
651 usnic_uiom_reg_release(mr->umem, ibmr->uobject->context); 651 usnic_uiom_reg_release(mr->umem);
652 kfree(mr); 652 kfree(mr);
653 return 0; 653 return 0;
654} 654}
diff --git a/drivers/infiniband/hw/usnic/usnic_uiom.c b/drivers/infiniband/hw/usnic/usnic_uiom.c
index 06862a6af185..da35d6fdfc5e 100644
--- a/drivers/infiniband/hw/usnic/usnic_uiom.c
+++ b/drivers/infiniband/hw/usnic/usnic_uiom.c
@@ -432,8 +432,7 @@ static inline size_t usnic_uiom_num_pages(struct usnic_uiom_reg *uiomr)
432 return PAGE_ALIGN(uiomr->length + uiomr->offset) >> PAGE_SHIFT; 432 return PAGE_ALIGN(uiomr->length + uiomr->offset) >> PAGE_SHIFT;
433} 433}
434 434
435void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, 435void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr)
436 struct ib_ucontext *context)
437{ 436{
438 __usnic_uiom_reg_release(uiomr->pd, uiomr, 1); 437 __usnic_uiom_reg_release(uiomr->pd, uiomr, 1);
439 438
diff --git a/drivers/infiniband/hw/usnic/usnic_uiom.h b/drivers/infiniband/hw/usnic/usnic_uiom.h
index c88cfa087e3a..70be49b1ca05 100644
--- a/drivers/infiniband/hw/usnic/usnic_uiom.h
+++ b/drivers/infiniband/hw/usnic/usnic_uiom.h
@@ -90,7 +90,6 @@ void usnic_uiom_free_dev_list(struct device **devs);
90struct usnic_uiom_reg *usnic_uiom_reg_get(struct usnic_uiom_pd *pd, 90struct usnic_uiom_reg *usnic_uiom_reg_get(struct usnic_uiom_pd *pd,
91 unsigned long addr, size_t size, 91 unsigned long addr, size_t size,
92 int access, int dmasync); 92 int access, int dmasync);
93void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, 93void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr);
94 struct ib_ucontext *ucontext);
95int usnic_uiom_init(char *drv_name); 94int usnic_uiom_init(char *drv_name);
96#endif /* USNIC_UIOM_H_ */ 95#endif /* USNIC_UIOM_H_ */