]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
IB: Allow calls to ib_umem_get from kernel ULPs
authorMoni Shoua <monis@mellanox.com>
Wed, 15 Jan 2020 12:43:31 +0000 (14:43 +0200)
committerLeon Romanovsky <leonro@mellanox.com>
Thu, 16 Jan 2020 14:14:28 +0000 (16:14 +0200)
So far the assumption was that ib_umem_get() and ib_umem_odp_get()
are called from flows that start in UVERBS and therefore has a user
context. This assumption restricts flows that are initiated by ULPs
and need the service that ib_umem_get() provides.

This patch changes ib_umem_get() and ib_umem_odp_get() to get IB device
directly by relying on the fact that both UVERBS and ULPs sets that
field correctly.

Reviewed-by: Guy Levi <guyle@mellanox.com>
Signed-off-by: Moni Shoua <monis@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
34 files changed:
drivers/infiniband/core/umem.c
drivers/infiniband/core/umem_odp.c
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/cxgb4/mem.c
drivers/infiniband/hw/efa/efa_verbs.c
drivers/infiniband/hw/hns/hns_roce_cq.c
drivers/infiniband/hw/hns/hns_roce_db.c
drivers/infiniband/hw/hns/hns_roce_mr.c
drivers/infiniband/hw/hns/hns_roce_qp.c
drivers/infiniband/hw/hns/hns_roce_srq.c
drivers/infiniband/hw/i40iw/i40iw_verbs.c
drivers/infiniband/hw/mlx4/cq.c
drivers/infiniband/hw/mlx4/doorbell.c
drivers/infiniband/hw/mlx4/mr.c
drivers/infiniband/hw/mlx4/qp.c
drivers/infiniband/hw/mlx4/srq.c
drivers/infiniband/hw/mlx5/cq.c
drivers/infiniband/hw/mlx5/devx.c
drivers/infiniband/hw/mlx5/doorbell.c
drivers/infiniband/hw/mlx5/mr.c
drivers/infiniband/hw/mlx5/odp.c
drivers/infiniband/hw/mlx5/qp.c
drivers/infiniband/hw/mlx5/srq.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_srq.c
drivers/infiniband/sw/rdmavt/mr.c
drivers/infiniband/sw/rxe/rxe_mr.c
include/rdma/ib_umem.h
include/rdma/ib_umem_odp.h

index 7a3b99597eada179ed5e0f8f2c6e6cab3a9a52d0..146f98fbf22b053f56530c83df04d8b77d890f09 100644 (file)
@@ -181,15 +181,14 @@ EXPORT_SYMBOL(ib_umem_find_best_pgsz);
 /**
  * ib_umem_get - Pin and DMA map userspace memory.
  *
- * @udata: userspace context to pin memory for
+ * @device: IB device to connect UMEM
  * @addr: userspace virtual address to start at
  * @size: length of region to pin
  * @access: IB_ACCESS_xxx flags for memory being pinned
  */
-struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
+struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr,
                            size_t size, int access)
 {
-       struct ib_ucontext *context;
        struct ib_umem *umem;
        struct page **page_list;
        unsigned long lock_limit;
@@ -201,14 +200,6 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
        struct scatterlist *sg;
        unsigned int gup_flags = FOLL_WRITE;
 
-       if (!udata)
-               return ERR_PTR(-EIO);
-
-       context = container_of(udata, struct uverbs_attr_bundle, driver_udata)
-                         ->context;
-       if (!context)
-               return ERR_PTR(-EIO);
-
        /*
         * If the combination of the addr and size requested for this memory
         * region causes an integer overflow, return error.
@@ -226,7 +217,7 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
        umem = kzalloc(sizeof(*umem), GFP_KERNEL);
        if (!umem)
                return ERR_PTR(-ENOMEM);
-       umem->ibdev = context->device;
+       umem->ibdev      = device;
        umem->length     = size;
        umem->address    = addr;
        umem->writable   = ib_access_writable(access);
@@ -281,7 +272,7 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
                npages   -= ret;
 
                sg = ib_umem_add_sg_table(sg, page_list, ret,
-                       dma_get_max_seg_size(context->device->dma_device),
+                       dma_get_max_seg_size(device->dma_device),
                        &umem->sg_nents);
 
                up_read(&mm->mmap_sem);
@@ -289,10 +280,10 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
 
        sg_mark_end(sg);
 
-       umem->nmap = ib_dma_map_sg(context->device,
-                                 umem->sg_head.sgl,
-                                 umem->sg_nents,
-                                 DMA_BIDIRECTIONAL);
+       umem->nmap = ib_dma_map_sg(device,
+                                  umem->sg_head.sgl,
+                                  umem->sg_nents,
+                                  DMA_BIDIRECTIONAL);
 
        if (!umem->nmap) {
                ret = -ENOMEM;
@@ -303,7 +294,7 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
        goto out;
 
 umem_release:
-       __ib_umem_release(context->device, umem, 0);
+       __ib_umem_release(device, umem, 0);
 vma:
        atomic64_sub(ib_umem_num_pages(umem), &mm->pinned_vm);
 out:
index e42d44e501fd5463051a18363c069bfb410b8366..dac3fd2ebc2648c29a7b84b95abc935e5c49bc2e 100644 (file)
@@ -110,15 +110,12 @@ static inline int ib_init_umem_odp(struct ib_umem_odp *umem_odp,
  * They exist only to hold the per_mm reference to help the driver create
  * children umems.
  *
- * @udata: udata from the syscall being used to create the umem
+ * @device: IB device to create UMEM
  * @access: ib_reg_mr access flags
  */
-struct ib_umem_odp *ib_umem_odp_alloc_implicit(struct ib_udata *udata,
+struct ib_umem_odp *ib_umem_odp_alloc_implicit(struct ib_device *device,
                                               int access)
 {
-       struct ib_ucontext *context =
-               container_of(udata, struct uverbs_attr_bundle, driver_udata)
-                       ->context;
        struct ib_umem *umem;
        struct ib_umem_odp *umem_odp;
        int ret;
@@ -126,14 +123,11 @@ struct ib_umem_odp *ib_umem_odp_alloc_implicit(struct ib_udata *udata,
        if (access & IB_ACCESS_HUGETLB)
                return ERR_PTR(-EINVAL);
 
-       if (!context)
-               return ERR_PTR(-EIO);
-
        umem_odp = kzalloc(sizeof(*umem_odp), GFP_KERNEL);
        if (!umem_odp)
                return ERR_PTR(-ENOMEM);
        umem = &umem_odp->umem;
-       umem->ibdev = context->device;
+       umem->ibdev = device;
        umem->writable = ib_access_writable(access);
        umem->owning_mm = current->mm;
        umem_odp->is_implicit_odp = 1;
@@ -201,7 +195,7 @@ EXPORT_SYMBOL(ib_umem_odp_alloc_child);
 /**
  * ib_umem_odp_get - Create a umem_odp for a userspace va
  *
- * @udata: userspace context to pin memory for
+ * @device: IB device struct to get UMEM
  * @addr: userspace virtual address to start at
  * @size: length of region to pin
  * @access: IB_ACCESS_xxx flags for memory being pinned
@@ -210,23 +204,14 @@ EXPORT_SYMBOL(ib_umem_odp_alloc_child);
  * pinning, instead, stores the mm for future page fault handling in
  * conjunction with MMU notifiers.
  */
-struct ib_umem_odp *ib_umem_odp_get(struct ib_udata *udata, unsigned long addr,
-                                   size_t size, int access,
+struct ib_umem_odp *ib_umem_odp_get(struct ib_device *device,
+                                   unsigned long addr, size_t size, int access,
                                    const struct mmu_interval_notifier_ops *ops)
 {
        struct ib_umem_odp *umem_odp;
-       struct ib_ucontext *context;
        struct mm_struct *mm;
        int ret;
 
-       if (!udata)
-               return ERR_PTR(-EIO);
-
-       context = container_of(udata, struct uverbs_attr_bundle, driver_udata)
-                         ->context;
-       if (!context)
-               return ERR_PTR(-EIO);
-
        if (WARN_ON_ONCE(!(access & IB_ACCESS_ON_DEMAND)))
                return ERR_PTR(-EINVAL);
 
@@ -234,7 +219,7 @@ struct ib_umem_odp *ib_umem_odp_get(struct ib_udata *udata, unsigned long addr,
        if (!umem_odp)
                return ERR_PTR(-ENOMEM);
 
-       umem_odp->umem.ibdev = context->device;
+       umem_odp->umem.ibdev = device;
        umem_odp->umem.length = size;
        umem_odp->umem.address = addr;
        umem_odp->umem.writable = ib_access_writable(access);
index ad5112a2325f9f2b51d8407a538de99d2d6473bd..52b6a4d854606e7cbc3c25df056cdd9b719646cd 100644 (file)
@@ -837,7 +837,8 @@ static int bnxt_re_init_user_qp(struct bnxt_re_dev *rdev, struct bnxt_re_pd *pd,
                bytes += (qplib_qp->sq.max_wqe * psn_sz);
        }
        bytes = PAGE_ALIGN(bytes);
-       umem = ib_umem_get(udata, ureq.qpsva, bytes, IB_ACCESS_LOCAL_WRITE);
+       umem = ib_umem_get(&rdev->ibdev, ureq.qpsva, bytes,
+                          IB_ACCESS_LOCAL_WRITE);
        if (IS_ERR(umem))
                return PTR_ERR(umem);
 
@@ -850,7 +851,7 @@ static int bnxt_re_init_user_qp(struct bnxt_re_dev *rdev, struct bnxt_re_pd *pd,
        if (!qp->qplib_qp.srq) {
                bytes = (qplib_qp->rq.max_wqe * BNXT_QPLIB_MAX_RQE_ENTRY_SIZE);
                bytes = PAGE_ALIGN(bytes);
-               umem = ib_umem_get(udata, ureq.qprva, bytes,
+               umem = ib_umem_get(&rdev->ibdev, ureq.qprva, bytes,
                                   IB_ACCESS_LOCAL_WRITE);
                if (IS_ERR(umem))
                        goto rqfail;
@@ -1304,7 +1305,8 @@ static int bnxt_re_init_user_srq(struct bnxt_re_dev *rdev,
 
        bytes = (qplib_srq->max_wqe * BNXT_QPLIB_MAX_RQE_ENTRY_SIZE);
        bytes = PAGE_ALIGN(bytes);
-       umem = ib_umem_get(udata, ureq.srqva, bytes, IB_ACCESS_LOCAL_WRITE);
+       umem = ib_umem_get(&rdev->ibdev, ureq.srqva, bytes,
+                          IB_ACCESS_LOCAL_WRITE);
        if (IS_ERR(umem))
                return PTR_ERR(umem);
 
@@ -2545,7 +2547,7 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
                        goto fail;
                }
 
-               cq->umem = ib_umem_get(udata, req.cq_va,
+               cq->umem = ib_umem_get(&rdev->ibdev, req.cq_va,
                                       entries * sizeof(struct cq_base),
                                       IB_ACCESS_LOCAL_WRITE);
                if (IS_ERR(cq->umem)) {
@@ -3514,7 +3516,7 @@ struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
        /* The fixed portion of the rkey is the same as the lkey */
        mr->ib_mr.rkey = mr->qplib_mr.rkey;
 
-       umem = ib_umem_get(udata, start, length, mr_access_flags);
+       umem = ib_umem_get(&rdev->ibdev, start, length, mr_access_flags);
        if (IS_ERR(umem)) {
                dev_err(rdev_to_dev(rdev), "Failed to get umem");
                rc = -EFAULT;
index fe3a7e8561dfff8e86ae20ee5db925fdf49c9107..962dc97a8ff2bc837cecf151c758677443fa009a 100644 (file)
@@ -543,7 +543,7 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 
        mhp->rhp = rhp;
 
-       mhp->umem = ib_umem_get(udata, start, length, acc);
+       mhp->umem = ib_umem_get(pd->device, start, length, acc);
        if (IS_ERR(mhp->umem))
                goto err_free_skb;
 
index 50c22575aed65041c33f2f008cd38a094cc2a714..5c35aa72f5150bb4df104641eb4f49e4cefa4fed 100644 (file)
@@ -1384,7 +1384,7 @@ struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
                goto err_out;
        }
 
-       mr->umem = ib_umem_get(udata, start, length, access_flags);
+       mr->umem = ib_umem_get(ibpd->device, start, length, access_flags);
        if (IS_ERR(mr->umem)) {
                err = PTR_ERR(mr->umem);
                ibdev_dbg(&dev->ibdev,
index af1d8823b3f01d521353fab56cec1f286abbce5a..a2d1e5331bf1b2770b4a1ec10ca5cade487db01c 100644 (file)
@@ -163,7 +163,7 @@ static int get_cq_umem(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
        u32 npages;
        int ret;
 
-       *umem = ib_umem_get(udata, ucmd.buf_addr, buf->size,
+       *umem = ib_umem_get(&hr_dev->ib_dev, ucmd.buf_addr, buf->size,
                            IB_ACCESS_LOCAL_WRITE);
        if (IS_ERR(*umem))
                return PTR_ERR(*umem);
index 10af6958ab694de8f1b8fc7d889a3ad956d1d14f..bff6abdccfb0c33fd1c053e8043514907c3870d9 100644 (file)
@@ -31,7 +31,8 @@ int hns_roce_db_map_user(struct hns_roce_ucontext *context,
 
        refcount_set(&page->refcount, 1);
        page->user_virt = page_addr;
-       page->umem = ib_umem_get(udata, page_addr, PAGE_SIZE, 0);
+       page->umem = ib_umem_get(context->ibucontext.device, page_addr,
+                                PAGE_SIZE, 0);
        if (IS_ERR(page->umem)) {
                ret = PTR_ERR(page->umem);
                kfree(page);
index 9ad19170c3f97d63a9f9986bd45eaeb1c6ecba0d..3ff610549c7433bc6f3f9bb6003c97d8192a1062 100644 (file)
@@ -1145,7 +1145,7 @@ struct ib_mr *hns_roce_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
        if (!mr)
                return ERR_PTR(-ENOMEM);
 
-       mr->umem = ib_umem_get(udata, start, length, access_flags);
+       mr->umem = ib_umem_get(pd->device, start, length, access_flags);
        if (IS_ERR(mr->umem)) {
                ret = PTR_ERR(mr->umem);
                goto err_free;
@@ -1230,7 +1230,7 @@ static int rereg_mr_trans(struct ib_mr *ibmr, int flags,
        }
        ib_umem_release(mr->umem);
 
-       mr->umem = ib_umem_get(udata, start, length, mr_access_flags);
+       mr->umem = ib_umem_get(ibmr->device, start, length, mr_access_flags);
        if (IS_ERR(mr->umem)) {
                ret = PTR_ERR(mr->umem);
                mr->umem = NULL;
index a6565b67480146282d2e68bf1be7018607b0526a..eb2ee6a581aa8abdcced8d6f1b9a3a916f87edea 100644 (file)
@@ -744,7 +744,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
                        goto err_alloc_rq_inline_buf;
                }
 
-               hr_qp->umem = ib_umem_get(udata, ucmd.buf_addr,
+               hr_qp->umem = ib_umem_get(ib_pd->device, ucmd.buf_addr,
                                          hr_qp->buff_size, 0);
                if (IS_ERR(hr_qp->umem)) {
                        dev_err(dev, "ib_umem_get error for create qp\n");
index 7113ebfdb4f032b241d7c8ea5f2119e453b1572c..c6d5f06f9cdeaeebcd3cf516437d6e003cbb0a19 100644 (file)
@@ -186,7 +186,8 @@ static int create_user_srq(struct hns_roce_srq *srq, struct ib_udata *udata,
        if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
                return -EFAULT;
 
-       srq->umem = ib_umem_get(udata, ucmd.buf_addr, srq_buf_size, 0);
+       srq->umem =
+               ib_umem_get(srq->ibsrq.device, ucmd.buf_addr, srq_buf_size, 0);
        if (IS_ERR(srq->umem))
                return PTR_ERR(srq->umem);
 
@@ -205,7 +206,7 @@ static int create_user_srq(struct hns_roce_srq *srq, struct ib_udata *udata,
                goto err_user_srq_mtt;
 
        /* config index queue BA */
-       srq->idx_que.umem = ib_umem_get(udata, ucmd.que_addr,
+       srq->idx_que.umem = ib_umem_get(srq->ibsrq.device, ucmd.que_addr,
                                        srq->idx_que.buf_size, 0);
        if (IS_ERR(srq->idx_que.umem)) {
                dev_err(hr_dev->dev, "ib_umem_get error for index queue\n");
index dbd96d029d8bd073c88229ba14ffc15d6feb7094..96488fb443eb59b963c35085a2293fc272618276 100644 (file)
@@ -1761,7 +1761,7 @@ static struct ib_mr *i40iw_reg_user_mr(struct ib_pd *pd,
 
        if (length > I40IW_MAX_MR_SIZE)
                return ERR_PTR(-EINVAL);
-       region = ib_umem_get(udata, start, length, acc);
+       region = ib_umem_get(pd->device, start, length, acc);
        if (IS_ERR(region))
                return (struct ib_mr *)region;
 
index 306b21281fa2ac4c29dc5bc9554c6bde9590d876..a57033d4b0e5b9df17b0bfe4371f3ca0451f5874 100644 (file)
@@ -144,7 +144,7 @@ static int mlx4_ib_get_cq_umem(struct mlx4_ib_dev *dev, struct ib_udata *udata,
        int shift;
        int n;
 
-       *umem = ib_umem_get(udata, buf_addr, cqe * cqe_size,
+       *umem = ib_umem_get(&dev->ib_dev, buf_addr, cqe * cqe_size,
                            IB_ACCESS_LOCAL_WRITE);
        if (IS_ERR(*umem))
                return PTR_ERR(*umem);
index 714f9df5bf3919143a11d4c6e1e6026fd2480bae..d41f03ccb0e1cec0605dcea4c3d46b92fd9e6491 100644 (file)
@@ -64,7 +64,8 @@ int mlx4_ib_db_map_user(struct ib_udata *udata, unsigned long virt,
 
        page->user_virt = (virt & PAGE_MASK);
        page->refcnt    = 0;
-       page->umem = ib_umem_get(udata, virt & PAGE_MASK, PAGE_SIZE, 0);
+       page->umem = ib_umem_get(context->ibucontext.device, virt & PAGE_MASK,
+                                PAGE_SIZE, 0);
        if (IS_ERR(page->umem)) {
                err = PTR_ERR(page->umem);
                kfree(page);
index dfa17bcdcdbcfbf1b03f2d351a9b83d9716b3ca9..b0121c90c561fa3b784f3299765ae781d8a8a7f9 100644 (file)
@@ -367,7 +367,7 @@ int mlx4_ib_umem_calc_optimal_mtt_size(struct ib_umem *umem, u64 start_va,
        return block_shift;
 }
 
-static struct ib_umem *mlx4_get_umem_mr(struct ib_udata *udata, u64 start,
+static struct ib_umem *mlx4_get_umem_mr(struct ib_device *device, u64 start,
                                        u64 length, int access_flags)
 {
        /*
@@ -398,7 +398,7 @@ static struct ib_umem *mlx4_get_umem_mr(struct ib_udata *udata, u64 start,
                up_read(&current->mm->mmap_sem);
        }
 
-       return ib_umem_get(udata, start, length, access_flags);
+       return ib_umem_get(device, start, length, access_flags);
 }
 
 struct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
@@ -415,7 +415,7 @@ struct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
        if (!mr)
                return ERR_PTR(-ENOMEM);
 
-       mr->umem = mlx4_get_umem_mr(udata, start, length, access_flags);
+       mr->umem = mlx4_get_umem_mr(pd->device, start, length, access_flags);
        if (IS_ERR(mr->umem)) {
                err = PTR_ERR(mr->umem);
                goto err_free;
@@ -504,7 +504,7 @@ int mlx4_ib_rereg_user_mr(struct ib_mr *mr, int flags,
 
                mlx4_mr_rereg_mem_cleanup(dev->dev, &mmr->mmr);
                ib_umem_release(mmr->umem);
-               mmr->umem = mlx4_get_umem_mr(udata, start, length,
+               mmr->umem = mlx4_get_umem_mr(mr->device, start, length,
                                             mr_access_flags);
                if (IS_ERR(mmr->umem)) {
                        err = PTR_ERR(mmr->umem);
index 85f57b76e446a815da90816d651c9a3d4cd2938e..cb23cdb9389aa724bda9264ed4793e2cddfce900 100644 (file)
@@ -916,7 +916,7 @@ static int create_rq(struct ib_pd *pd, struct ib_qp_init_attr *init_attr,
        qp->buf_size = (qp->rq.wqe_cnt << qp->rq.wqe_shift) +
                       (qp->sq.wqe_cnt << qp->sq.wqe_shift);
 
-       qp->umem = ib_umem_get(udata, wq.buf_addr, qp->buf_size, 0);
+       qp->umem = ib_umem_get(pd->device, wq.buf_addr, qp->buf_size, 0);
        if (IS_ERR(qp->umem)) {
                err = PTR_ERR(qp->umem);
                goto err;
@@ -1110,7 +1110,8 @@ static int create_qp_common(struct ib_pd *pd, struct ib_qp_init_attr *init_attr,
                if (err)
                        goto err;
 
-               qp->umem = ib_umem_get(udata, ucmd.buf_addr, qp->buf_size, 0);
+               qp->umem =
+                       ib_umem_get(pd->device, ucmd.buf_addr, qp->buf_size, 0);
                if (IS_ERR(qp->umem)) {
                        err = PTR_ERR(qp->umem);
                        goto err;
index 8dcf6e3d9ae24b605433fd4b38f796acb83c383e..8f9d5035142d338189f3df968c44facd49a42506 100644 (file)
@@ -110,7 +110,8 @@ int mlx4_ib_create_srq(struct ib_srq *ib_srq,
                if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
                        return -EFAULT;
 
-               srq->umem = ib_umem_get(udata, ucmd.buf_addr, buf_size, 0);
+               srq->umem =
+                       ib_umem_get(ib_srq->device, ucmd.buf_addr, buf_size, 0);
                if (IS_ERR(srq->umem))
                        return PTR_ERR(srq->umem);
 
index dd8d24ee8e1d9acfa6b0be8b2a64ca9aacc3b995..367a71bc5f4b628b97f5bc70e0e1efd910b100ba 100644 (file)
@@ -708,8 +708,8 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
        *cqe_size = ucmd.cqe_size;
 
        cq->buf.umem =
-               ib_umem_get(udata, ucmd.buf_addr, entries * ucmd.cqe_size,
-                           IB_ACCESS_LOCAL_WRITE);
+               ib_umem_get(&dev->ib_dev, ucmd.buf_addr,
+                           entries * ucmd.cqe_size, IB_ACCESS_LOCAL_WRITE);
        if (IS_ERR(cq->buf.umem)) {
                err = PTR_ERR(cq->buf.umem);
                return err;
@@ -1108,7 +1108,7 @@ static int resize_user(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
        if (ucmd.cqe_size && SIZE_MAX / ucmd.cqe_size <= entries - 1)
                return -EINVAL;
 
-       umem = ib_umem_get(udata, ucmd.buf_addr,
+       umem = ib_umem_get(&dev->ib_dev, ucmd.buf_addr,
                           (size_t)ucmd.cqe_size * entries,
                           IB_ACCESS_LOCAL_WRITE);
        if (IS_ERR(umem)) {
index 9d0a18cf9e5ebd28806dcd250d7b1c3903b574aa..685b8ed96b4ea40ce4c9730a33acb16543ffc559 100644 (file)
@@ -2134,7 +2134,7 @@ static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext,
        if (err)
                return err;
 
-       obj->umem = ib_umem_get(&attrs->driver_udata, addr, size, access);
+       obj->umem = ib_umem_get(&dev->ib_dev, addr, size, access);
        if (IS_ERR(obj->umem))
                return PTR_ERR(obj->umem);
 
index 12737c509aa20ef55c9893af95f50dcf140e97b4..61475b571531271f22bccc852d1bf6051898386f 100644 (file)
@@ -64,7 +64,8 @@ int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context,
 
        page->user_virt = (virt & PAGE_MASK);
        page->refcnt    = 0;
-       page->umem = ib_umem_get(udata, virt & PAGE_MASK, PAGE_SIZE, 0);
+       page->umem = ib_umem_get(context->ibucontext.device, virt & PAGE_MASK,
+                                PAGE_SIZE, 0);
        if (IS_ERR(page->umem)) {
                err = PTR_ERR(page->umem);
                kfree(page);
index ea8bfc3e2d8d4892720cdecf6f0bbac73106c76b..f79bb44b94fe8be571ecb4b5cd57273e8b793000 100644 (file)
@@ -737,10 +737,9 @@ static int mr_cache_max_order(struct mlx5_ib_dev *dev)
        return MLX5_MAX_UMR_SHIFT;
 }
 
-static int mr_umem_get(struct mlx5_ib_dev *dev, struct ib_udata *udata,
-                      u64 start, u64 length, int access_flags,
-                      struct ib_umem **umem, int *npages, int *page_shift,
-                      int *ncont, int *order)
+static int mr_umem_get(struct mlx5_ib_dev *dev, u64 start, u64 length,
+                      int access_flags, struct ib_umem **umem, int *npages,
+                      int *page_shift, int *ncont, int *order)
 {
        struct ib_umem *u;
 
@@ -749,7 +748,7 @@ static int mr_umem_get(struct mlx5_ib_dev *dev, struct ib_udata *udata,
        if (access_flags & IB_ACCESS_ON_DEMAND) {
                struct ib_umem_odp *odp;
 
-               odp = ib_umem_odp_get(udata, start, length, access_flags,
+               odp = ib_umem_odp_get(&dev->ib_dev, start, length, access_flags,
                                      &mlx5_mn_ops);
                if (IS_ERR(odp)) {
                        mlx5_ib_dbg(dev, "umem get failed (%ld)\n",
@@ -765,7 +764,7 @@ static int mr_umem_get(struct mlx5_ib_dev *dev, struct ib_udata *udata,
                if (order)
                        *order = ilog2(roundup_pow_of_two(*ncont));
        } else {
-               u = ib_umem_get(udata, start, length, access_flags);
+               u = ib_umem_get(&dev->ib_dev, start, length, access_flags);
                if (IS_ERR(u)) {
                        mlx5_ib_dbg(dev, "umem get failed (%ld)\n", PTR_ERR(u));
                        return PTR_ERR(u);
@@ -1257,7 +1256,7 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
                return &mr->ibmr;
        }
 
-       err = mr_umem_get(dev, udata, start, length, access_flags, &umem,
+       err = mr_umem_get(dev, start, length, access_flags, &umem,
                          &npages, &page_shift, &ncont, &order);
 
        if (err < 0)
@@ -1424,9 +1423,8 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
                flags |= IB_MR_REREG_TRANS;
                ib_umem_release(mr->umem);
                mr->umem = NULL;
-               err = mr_umem_get(dev, udata, addr, len, access_flags,
-                                 &mr->umem, &npages, &page_shift, &ncont,
-                                 &order);
+               err = mr_umem_get(dev, addr, len, access_flags, &mr->umem,
+                                 &npages, &page_shift, &ncont, &order);
                if (err)
                        goto err;
        }
index f924250f80c2e97382c81a332035fc5565ce9884..3b3ceb5acdd3a81abaa10885ac1eb2f88d62e066 100644 (file)
@@ -497,7 +497,7 @@ struct mlx5_ib_mr *mlx5_ib_alloc_implicit_mr(struct mlx5_ib_pd *pd,
        struct mlx5_ib_mr *imr;
        int err;
 
-       umem_odp = ib_umem_odp_alloc_implicit(udata, access_flags);
+       umem_odp = ib_umem_odp_alloc_implicit(&dev->ib_dev, access_flags);
        if (IS_ERR(umem_odp))
                return ERR_CAST(umem_odp);
 
index 7e51870e9e0141fa6001b9e2cf88e18b8c6508d2..7f0bde3135605ab4647187a4dcd8884cfbc2b9c2 100644 (file)
@@ -749,7 +749,7 @@ static int mlx5_ib_umem_get(struct mlx5_ib_dev *dev, struct ib_udata *udata,
 {
        int err;
 
-       *umem = ib_umem_get(udata, addr, size, 0);
+       *umem = ib_umem_get(&dev->ib_dev, addr, size, 0);
        if (IS_ERR(*umem)) {
                mlx5_ib_dbg(dev, "umem_get failed\n");
                return PTR_ERR(*umem);
@@ -806,7 +806,7 @@ static int create_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd,
        if (!ucmd->buf_addr)
                return -EINVAL;
 
-       rwq->umem = ib_umem_get(udata, ucmd->buf_addr, rwq->buf_size, 0);
+       rwq->umem = ib_umem_get(&dev->ib_dev, ucmd->buf_addr, rwq->buf_size, 0);
        if (IS_ERR(rwq->umem)) {
                mlx5_ib_dbg(dev, "umem_get failed\n");
                err = PTR_ERR(rwq->umem);
index 62939df3c692a5e7a34540ddecb94fdb4f5c5399..b1a8a91750400d25e8dbbd31bcb58af58a57877b 100644 (file)
@@ -80,7 +80,7 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
 
        srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE);
 
-       srq->umem = ib_umem_get(udata, ucmd.buf_addr, buf_size, 0);
+       srq->umem = ib_umem_get(pd->device, ucmd.buf_addr, buf_size, 0);
        if (IS_ERR(srq->umem)) {
                mlx5_ib_dbg(dev, "failed umem get, size %d\n", buf_size);
                err = PTR_ERR(srq->umem);
index 33002530fee709aabd208d5c4c33088e45a36965..ac19d57803b523571f444e6a7fd2c2ba77665ef7 100644 (file)
@@ -880,7 +880,7 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
        if (!mr)
                return ERR_PTR(-ENOMEM);
 
-       mr->umem = ib_umem_get(udata, start, length, acc);
+       mr->umem = ib_umem_get(pd->device, start, length, acc);
        if (IS_ERR(mr->umem)) {
                err = PTR_ERR(mr->umem);
                goto err;
index 9bc1ca6f6f9e60e4246e864b310d4f28c5f1646f..d47ea675734bb9bd5d3a4ea7d0a4fa4c676255fb 100644 (file)
@@ -869,7 +869,7 @@ struct ib_mr *ocrdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
        mr = kzalloc(sizeof(*mr), GFP_KERNEL);
        if (!mr)
                return ERR_PTR(status);
-       mr->umem = ib_umem_get(udata, start, len, acc);
+       mr->umem = ib_umem_get(ibpd->device, start, len, acc);
        if (IS_ERR(mr->umem)) {
                status = -EFAULT;
                goto umem_err;
index 4cd292966aa9c42c0db18d7e70ea41c0fbade5e6..920f35e28cfc45df26d03eb9c63ade843b1613be 100644 (file)
@@ -772,7 +772,7 @@ static inline int qedr_init_user_queue(struct ib_udata *udata,
 
        q->buf_addr = buf_addr;
        q->buf_len = buf_len;
-       q->umem = ib_umem_get(udata, q->buf_addr, q->buf_len, access);
+       q->umem = ib_umem_get(&dev->ibdev, q->buf_addr, q->buf_len, access);
        if (IS_ERR(q->umem)) {
                DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
                       PTR_ERR(q->umem));
@@ -1415,9 +1415,8 @@ static int qedr_init_srq_user_params(struct ib_udata *udata,
        if (rc)
                return rc;
 
-       srq->prod_umem =
-               ib_umem_get(udata, ureq->prod_pair_addr,
-                           sizeof(struct rdma_srq_producers), access);
+       srq->prod_umem = ib_umem_get(srq->ibsrq.device, ureq->prod_pair_addr,
+                                    sizeof(struct rdma_srq_producers), access);
        if (IS_ERR(srq->prod_umem)) {
                qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
                ib_umem_release(srq->usrq.umem);
@@ -2839,7 +2838,7 @@ struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
 
        mr->type = QEDR_MR_USER;
 
-       mr->umem = ib_umem_get(udata, start, len, acc);
+       mr->umem = ib_umem_get(ibpd->device, start, len, acc);
        if (IS_ERR(mr->umem)) {
                rc = -EFAULT;
                goto err0;
index a26a4fd86bf4a75d74963a069304d3ee25b263d3..4f6cc0de7ef95760d8faf4a6d1f7b7f5a40a97e5 100644 (file)
@@ -135,7 +135,7 @@ int pvrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
                        goto err_cq;
                }
 
-               cq->umem = ib_umem_get(udata, ucmd.buf_addr, ucmd.buf_size,
+               cq->umem = ib_umem_get(ibdev, ucmd.buf_addr, ucmd.buf_size,
                                       IB_ACCESS_LOCAL_WRITE);
                if (IS_ERR(cq->umem)) {
                        ret = PTR_ERR(cq->umem);
index c61e665ff26151aa9070af28aff0680e06687bf0..b039f1f00e05abaa1848e3e36ee9d013147c4836 100644 (file)
@@ -126,7 +126,7 @@ struct ib_mr *pvrdma_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
                return ERR_PTR(-EINVAL);
        }
 
-       umem = ib_umem_get(udata, start, length, access_flags);
+       umem = ib_umem_get(pd->device, start, length, access_flags);
        if (IS_ERR(umem)) {
                dev_warn(&dev->pdev->dev,
                         "could not get umem for mem region\n");
index f15809c28f67342048550a730a4d86e85ec44bc7..9de1281f9a3babadfd80ffb2a93853d172931e9f 100644 (file)
@@ -276,8 +276,9 @@ struct ib_qp *pvrdma_create_qp(struct ib_pd *pd,
 
                        if (!is_srq) {
                                /* set qp->sq.wqe_cnt, shift, buf_size.. */
-                               qp->rumem = ib_umem_get(udata, ucmd.rbuf_addr,
-                                                       ucmd.rbuf_size, 0);
+                               qp->rumem =
+                                       ib_umem_get(pd->device, ucmd.rbuf_addr,
+                                                   ucmd.rbuf_size, 0);
                                if (IS_ERR(qp->rumem)) {
                                        ret = PTR_ERR(qp->rumem);
                                        goto err_qp;
@@ -288,7 +289,7 @@ struct ib_qp *pvrdma_create_qp(struct ib_pd *pd,
                                qp->srq = to_vsrq(init_attr->srq);
                        }
 
-                       qp->sumem = ib_umem_get(udata, ucmd.sbuf_addr,
+                       qp->sumem = ib_umem_get(pd->device, ucmd.sbuf_addr,
                                                ucmd.sbuf_size, 0);
                        if (IS_ERR(qp->sumem)) {
                                if (!is_srq)
index 98c8be71d91de5bb661ca53a3c28750381954bbe..d330decfb80a2434babae97c526889ac6fd24f84 100644 (file)
@@ -146,7 +146,7 @@ int pvrdma_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
                goto err_srq;
        }
 
-       srq->umem = ib_umem_get(udata, ucmd.buf_addr, ucmd.buf_size, 0);
+       srq->umem = ib_umem_get(ibsrq->device, ucmd.buf_addr, ucmd.buf_size, 0);
        if (IS_ERR(srq->umem)) {
                ret = PTR_ERR(srq->umem);
                goto err_srq;
index b9a76bf74857440c4218dcb59a8e33cc5bf02006..72f6534fbb52b78a51d65ef3a9df049eaac010ea 100644 (file)
@@ -390,7 +390,7 @@ struct ib_mr *rvt_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
        if (length == 0)
                return ERR_PTR(-EINVAL);
 
-       umem = ib_umem_get(udata, start, length, mr_access_flags);
+       umem = ib_umem_get(pd->device, start, length, mr_access_flags);
        if (IS_ERR(umem))
                return (void *)umem;
 
index 35a2baf2f36453d3a2552ba94e2259a76822431b..e83c7b518bfa2a61cda15573755dea8d34757400 100644 (file)
@@ -169,7 +169,7 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
        void                    *vaddr;
        int err;
 
-       umem = ib_umem_get(udata, start, length, access);
+       umem = ib_umem_get(pd->ibpd.device, start, length, access);
        if (IS_ERR(umem)) {
                pr_warn("err %d from rxe_umem_get\n",
                        (int)PTR_ERR(umem));
index 753f54e17e0af940899931a8e18017d9d0c347de..e3518fd6b95b14bd63b288dc1657d75435e15b29 100644 (file)
@@ -69,7 +69,7 @@ static inline size_t ib_umem_num_pages(struct ib_umem *umem)
 
 #ifdef CONFIG_INFINIBAND_USER_MEM
 
-struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
+struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr,
                            size_t size, int access);
 void ib_umem_release(struct ib_umem *umem);
 int ib_umem_page_count(struct ib_umem *umem);
@@ -83,7 +83,7 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,
 
 #include <linux/err.h>
 
-static inline struct ib_umem *ib_umem_get(struct ib_udata *udata,
+static inline struct ib_umem *ib_umem_get(struct ib_device *device,
                                          unsigned long addr, size_t size,
                                          int access)
 {
index 81429acc82577494125d9872e089954e09f32be4..64314ff76612961eb157ff2e2fc1bcace744b252 100644 (file)
@@ -114,9 +114,9 @@ static inline size_t ib_umem_odp_num_pages(struct ib_umem_odp *umem_odp)
 #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
 
 struct ib_umem_odp *
-ib_umem_odp_get(struct ib_udata *udata, unsigned long addr, size_t size,
+ib_umem_odp_get(struct ib_device *device, unsigned long addr, size_t size,
                int access, const struct mmu_interval_notifier_ops *ops);
-struct ib_umem_odp *ib_umem_odp_alloc_implicit(struct ib_udata *udata,
+struct ib_umem_odp *ib_umem_odp_alloc_implicit(struct ib_device *device,
                                               int access);
 struct ib_umem_odp *
 ib_umem_odp_alloc_child(struct ib_umem_odp *root_umem, unsigned long addr,
@@ -134,7 +134,7 @@ void ib_umem_odp_unmap_dma_pages(struct ib_umem_odp *umem_odp, u64 start_offset,
 #else /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
 
 static inline struct ib_umem_odp *
-ib_umem_odp_get(struct ib_udata *udata, unsigned long addr, size_t size,
+ib_umem_odp_get(struct ib_device *device, unsigned long addr, size_t size,
                int access, const struct mmu_interval_notifier_ops *ops)
 {
        return ERR_PTR(-EINVAL);