diff options
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); | |||
240 | void ib_uverbs_event_handler(struct ib_event_handler *handler, | 240 | void ib_uverbs_event_handler(struct ib_event_handler *handler, |
241 | struct ib_event *event); | 241 | struct ib_event *event); |
242 | int ib_uverbs_dealloc_xrcd(struct ib_uobject *uobject, struct ib_xrcd *xrcd, | 242 | int 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 | ||
245 | int uverbs_dealloc_mw(struct ib_mw *mw); | 246 | int uverbs_dealloc_mw(struct ib_mw *mw); |
246 | void ib_uverbs_detach_umcast(struct ib_qp *qp, | 247 | void 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 | ||
672 | int ib_uverbs_dealloc_xrcd(struct ib_uobject *uobject, struct ib_xrcd *xrcd, | 672 | int 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 | ||
35 | static int destroy_cq(struct c4iw_rdev *rdev, struct t4_cq *cq, | 37 | static 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 | ||
4443 | static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev, | 4444 | static 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 | ||
42 | static void mlx4_ib_cq_comp(struct mlx4_cq *cq) | 43 | static 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 | ||
1340 | static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp, | 1340 | static 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 | ||
1597 | static int _mlx4_ib_destroy_qp(struct ib_qp *qp) | 1605 | static 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 | ||
1643 | static int to_mlx4_st(struct mlx4_ib_dev *dev, enum mlx4_ib_qp_type type) | 1651 | static 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 | ||
799 | static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_ucontext *context) | 799 | static 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 | ||
986 | err_cqb: | 989 | err_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 | ||
779 | static void destroy_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd, | 779 | static 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 | ||
985 | static void destroy_qp_user(struct mlx5_ib_dev *dev, struct ib_pd *pd, | 988 | static 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 | ||
2285 | err_create: | 2292 | err_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 | ||
2398 | static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp) | 2405 | static 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 | ||
2472 | static const char *ib_qp_type_str(enum ib_qp_type type) | 2480 | static 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, | |||
5959 | err_copy: | 5967 | err_copy: |
5960 | mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp); | 5968 | mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp); |
5961 | err_user_rq: | 5969 | err_user_rq: |
5962 | destroy_user_rq(dev, pd, rwq); | 5970 | destroy_user_rq(dev, pd, rwq, udata); |
5963 | err: | 5971 | err: |
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 | ||
197 | static void destroy_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq) | 197 | static 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 | ||
328 | err_usr_kern_srq: | 334 | err_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 | ||
480 | static int mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata) | 480 | static 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 | ||
610 | static int mthca_destroy_qp(struct ib_qp *qp, struct ib_udata *udata) | 612 | static 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 | ||
830 | static int mthca_destroy_cq(struct ib_cq *cq, struct ib_udata *udata) | 838 | static 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 | ||
2473 | static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp) | 2473 | static 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 | ||
435 | void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, | 435 | void 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); | |||
90 | struct usnic_uiom_reg *usnic_uiom_reg_get(struct usnic_uiom_pd *pd, | 90 | struct 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); |
93 | void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, | 93 | void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr); |
94 | struct ib_ucontext *ucontext); | ||
95 | int usnic_uiom_init(char *drv_name); | 94 | int usnic_uiom_init(char *drv_name); |
96 | #endif /* USNIC_UIOM_H_ */ | 95 | #endif /* USNIC_UIOM_H_ */ |