| .. | .. |
|---|
| 119 | 119 | union pvrdma_cmd_resp rsp; |
|---|
| 120 | 120 | struct pvrdma_cmd_create_mr *cmd = &req.create_mr; |
|---|
| 121 | 121 | struct pvrdma_cmd_create_mr_resp *resp = &rsp.create_mr_resp; |
|---|
| 122 | | - int ret; |
|---|
| 122 | + int ret, npages; |
|---|
| 123 | 123 | |
|---|
| 124 | 124 | if (length == 0 || length > dev->dsr->caps.max_mr_size) { |
|---|
| 125 | 125 | dev_warn(&dev->pdev->dev, "invalid mem region length\n"); |
|---|
| 126 | 126 | return ERR_PTR(-EINVAL); |
|---|
| 127 | 127 | } |
|---|
| 128 | 128 | |
|---|
| 129 | | - umem = ib_umem_get(pd->uobject->context, start, |
|---|
| 130 | | - length, access_flags, 0); |
|---|
| 129 | + umem = ib_umem_get(pd->device, start, length, access_flags); |
|---|
| 131 | 130 | if (IS_ERR(umem)) { |
|---|
| 132 | 131 | dev_warn(&dev->pdev->dev, |
|---|
| 133 | 132 | "could not get umem for mem region\n"); |
|---|
| 134 | 133 | return ERR_CAST(umem); |
|---|
| 135 | 134 | } |
|---|
| 136 | 135 | |
|---|
| 137 | | - if (umem->npages < 0 || umem->npages > PVRDMA_PAGE_DIR_MAX_PAGES) { |
|---|
| 136 | + npages = ib_umem_num_dma_blocks(umem, PAGE_SIZE); |
|---|
| 137 | + if (npages < 0 || npages > PVRDMA_PAGE_DIR_MAX_PAGES) { |
|---|
| 138 | 138 | dev_warn(&dev->pdev->dev, "overflow %d pages in mem region\n", |
|---|
| 139 | | - umem->npages); |
|---|
| 139 | + npages); |
|---|
| 140 | 140 | ret = -EINVAL; |
|---|
| 141 | 141 | goto err_umem; |
|---|
| 142 | 142 | } |
|---|
| .. | .. |
|---|
| 151 | 151 | mr->mmr.size = length; |
|---|
| 152 | 152 | mr->umem = umem; |
|---|
| 153 | 153 | |
|---|
| 154 | | - ret = pvrdma_page_dir_init(dev, &mr->pdir, umem->npages, false); |
|---|
| 154 | + ret = pvrdma_page_dir_init(dev, &mr->pdir, npages, false); |
|---|
| 155 | 155 | if (ret) { |
|---|
| 156 | 156 | dev_warn(&dev->pdev->dev, |
|---|
| 157 | 157 | "could not allocate page directory\n"); |
|---|
| .. | .. |
|---|
| 168 | 168 | cmd->length = length; |
|---|
| 169 | 169 | cmd->pd_handle = to_vpd(pd)->pd_handle; |
|---|
| 170 | 170 | cmd->access_flags = access_flags; |
|---|
| 171 | | - cmd->nchunks = umem->npages; |
|---|
| 171 | + cmd->nchunks = npages; |
|---|
| 172 | 172 | cmd->pdir_dma = mr->pdir.dir_dma; |
|---|
| 173 | 173 | |
|---|
| 174 | 174 | ret = pvrdma_cmd_post(dev, &req, &rsp, PVRDMA_CMD_CREATE_MR_RESP); |
|---|
| .. | .. |
|---|
| 270 | 270 | /** |
|---|
| 271 | 271 | * pvrdma_dereg_mr - deregister a memory region |
|---|
| 272 | 272 | * @ibmr: memory region |
|---|
| 273 | + * @udata: pointer to user data |
|---|
| 273 | 274 | * |
|---|
| 274 | 275 | * @return: 0 on success. |
|---|
| 275 | 276 | */ |
|---|
| 276 | | -int pvrdma_dereg_mr(struct ib_mr *ibmr) |
|---|
| 277 | +int pvrdma_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) |
|---|
| 277 | 278 | { |
|---|
| 278 | 279 | struct pvrdma_user_mr *mr = to_vmr(ibmr); |
|---|
| 279 | 280 | struct pvrdma_dev *dev = to_vdev(ibmr->device); |
|---|
| .. | .. |
|---|
| 290 | 291 | "could not deregister mem region, error: %d\n", ret); |
|---|
| 291 | 292 | |
|---|
| 292 | 293 | pvrdma_page_dir_cleanup(dev, &mr->pdir); |
|---|
| 293 | | - if (mr->umem) |
|---|
| 294 | | - ib_umem_release(mr->umem); |
|---|
| 294 | + ib_umem_release(mr->umem); |
|---|
| 295 | 295 | |
|---|
| 296 | 296 | kfree(mr->pages); |
|---|
| 297 | 297 | kfree(mr); |
|---|