• Home
  • Raw
  • Download

Lines Matching refs:umem

46 static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)  in __ib_umem_release()  argument
52 if (umem->nmap > 0) in __ib_umem_release()
53 ib_dma_unmap_sg(dev, umem->sg_head.sgl, in __ib_umem_release()
54 umem->nmap, in __ib_umem_release()
57 for_each_sg(umem->sg_head.sgl, sg, umem->npages, i) { in __ib_umem_release()
60 if (umem->writable && dirty) in __ib_umem_release()
65 sg_free_table(&umem->sg_head); in __ib_umem_release()
81 struct ib_umem *umem; in ib_umem_get() local
111 umem = kzalloc(sizeof *umem, GFP_KERNEL); in ib_umem_get()
112 if (!umem) in ib_umem_get()
115 umem->context = context; in ib_umem_get()
116 umem->length = size; in ib_umem_get()
117 umem->offset = addr & ~PAGE_MASK; in ib_umem_get()
118 umem->page_size = PAGE_SIZE; in ib_umem_get()
119 umem->pid = get_task_pid(current, PIDTYPE_PID); in ib_umem_get()
127 umem->writable = !!(access & ~IB_ACCESS_REMOTE_READ); in ib_umem_get()
130 umem->hugetlb = 1; in ib_umem_get()
134 kfree(umem); in ib_umem_get()
144 umem->hugetlb = 0; in ib_umem_get()
146 npages = PAGE_ALIGN(size + umem->offset) >> PAGE_SHIFT; in ib_umem_get()
165 ret = sg_alloc_table(&umem->sg_head, npages, GFP_KERNEL); in ib_umem_get()
170 sg_list_start = umem->sg_head.sgl; in ib_umem_get()
176 1, !umem->writable, page_list, vma_list); in ib_umem_get()
181 umem->npages += ret; in ib_umem_get()
187 umem->hugetlb = 0; in ib_umem_get()
196 umem->nmap = ib_dma_map_sg_attrs(context->device, in ib_umem_get()
197 umem->sg_head.sgl, in ib_umem_get()
198 umem->npages, in ib_umem_get()
202 if (umem->nmap <= 0) { in ib_umem_get()
212 __ib_umem_release(context->device, umem, 0); in ib_umem_get()
213 put_pid(umem->pid); in ib_umem_get()
214 kfree(umem); in ib_umem_get()
223 return ret < 0 ? ERR_PTR(ret) : umem; in ib_umem_get()
229 struct ib_umem *umem = container_of(work, struct ib_umem, work); in ib_umem_account() local
231 down_write(&umem->mm->mmap_sem); in ib_umem_account()
232 umem->mm->pinned_vm -= umem->diff; in ib_umem_account()
233 up_write(&umem->mm->mmap_sem); in ib_umem_account()
234 mmput(umem->mm); in ib_umem_account()
235 kfree(umem); in ib_umem_account()
242 void ib_umem_release(struct ib_umem *umem) in ib_umem_release() argument
244 struct ib_ucontext *context = umem->context; in ib_umem_release()
249 __ib_umem_release(umem->context->device, umem, 1); in ib_umem_release()
251 task = get_pid_task(umem->pid, PIDTYPE_PID); in ib_umem_release()
252 put_pid(umem->pid); in ib_umem_release()
260 diff = PAGE_ALIGN(umem->length + umem->offset) >> PAGE_SHIFT; in ib_umem_release()
272 INIT_WORK(&umem->work, ib_umem_account); in ib_umem_release()
273 umem->mm = mm; in ib_umem_release()
274 umem->diff = diff; in ib_umem_release()
276 queue_work(ib_wq, &umem->work); in ib_umem_release()
286 kfree(umem); in ib_umem_release()
290 int ib_umem_page_count(struct ib_umem *umem) in ib_umem_page_count() argument
297 shift = ilog2(umem->page_size); in ib_umem_page_count()
300 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, i) in ib_umem_page_count()