.. | .. |
---|
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); |
---|