• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/sys/ofed/drivers/infiniband/core/

Lines Matching defs:umem

53 static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)
59 if (umem->nmap > 0)
60 ib_dma_unmap_sg(dev, umem->sg_head.sgl,
61 umem->nmap,
64 for_each_sg(umem->sg_head.sgl, sg, umem->npages, i) {
70 sg_free_table(&umem->sg_head);
90 struct ib_umem *umem;
120 umem = kzalloc(sizeof *umem, GFP_KERNEL);
121 if (!umem)
124 umem->context = context;
125 umem->length = size;
126 umem->address = addr;
127 umem->page_size = PAGE_SIZE;
128 umem->pid = get_pid(task_pid(current));
136 umem->writable = !!(access &
141 ret = ib_umem_odp_get(context, umem);
143 kfree(umem);
146 return umem;
149 umem->odp_data = NULL;
153 kfree(umem);
159 npages = ib_umem_num_pages(umem);
172 ret = sg_alloc_table(&umem->sg_head, npages, GFP_KERNEL);
176 if (!umem->writable)
180 sg_list_start = umem->sg_head.sgl;
191 umem->npages += ret;
203 umem->nmap = ib_dma_map_sg_attrs(context->device,
204 umem->sg_head.sgl,
205 umem->npages,
209 if (umem->nmap <= 0) {
219 __ib_umem_release(context->device, umem, 0);
220 put_pid(umem->pid);
221 kfree(umem);
230 return ret < 0 ? ERR_PTR(ret) : umem;
236 struct ib_umem *umem = container_of(work, struct ib_umem, work);
238 down_write(&umem->mm->mmap_sem);
239 umem->mm->pinned_vm -= umem->diff;
240 up_write(&umem->mm->mmap_sem);
241 mmput(umem->mm);
242 kfree(umem);
247 * @umem: umem struct to release
249 void ib_umem_release(struct ib_umem *umem)
251 struct ib_ucontext *context = umem->context;
256 if (umem->odp_data) {
257 ib_umem_odp_release(umem);
261 __ib_umem_release(umem->context->device, umem, 1);
263 task = get_pid_task(umem->pid, PIDTYPE_PID);
264 put_pid(umem->pid);
272 diff = ib_umem_num_pages(umem);
284 INIT_WORK(&umem->work, ib_umem_account);
285 umem->mm = mm;
286 umem->diff = diff;
288 queue_work(ib_wq, &umem->work);
298 kfree(umem);
302 int ib_umem_page_count(struct ib_umem *umem)
309 if (umem->odp_data)
310 return ib_umem_num_pages(umem);
312 shift = ilog2(umem->page_size);
315 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, i)
325 * umem - the umem to copy from
332 int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset,
338 if (offset > umem->length || length > umem->length - offset) {
339 pr_err("ib_umem_copy_from not in range. offset: %zd umem length: %zd end: %zd\n",
340 offset, umem->length, end);
345 ret = sg_pcopy_to_buffer(umem->sg_head.sgl, umem->nmap, dst, length,
346 offset + ib_umem_offset(umem));