Lines Matching refs:map
79 static void unmap_grant_pages(struct gntdev_grant_map *map,
95 struct gntdev_grant_map *map; in gntdev_print_maps() local
98 list_for_each_entry(map, &priv->maps, next) in gntdev_print_maps()
100 map->index, map->count, in gntdev_print_maps()
101 map->index == text_index && text ? text : ""); in gntdev_print_maps()
105 static void gntdev_free_map(struct gntdev_grant_map *map) in gntdev_free_map() argument
107 if (map == NULL) in gntdev_free_map()
111 if (map->dma_vaddr) { in gntdev_free_map()
114 args.dev = map->dma_dev; in gntdev_free_map()
115 args.coherent = !!(map->dma_flags & GNTDEV_DMA_FLAG_COHERENT); in gntdev_free_map()
116 args.nr_pages = map->count; in gntdev_free_map()
117 args.pages = map->pages; in gntdev_free_map()
118 args.frames = map->frames; in gntdev_free_map()
119 args.vaddr = map->dma_vaddr; in gntdev_free_map()
120 args.dev_bus_addr = map->dma_bus_addr; in gntdev_free_map()
125 if (map->pages) in gntdev_free_map()
126 gnttab_free_pages(map->count, map->pages); in gntdev_free_map()
129 kvfree(map->frames); in gntdev_free_map()
131 kvfree(map->pages); in gntdev_free_map()
132 kvfree(map->grants); in gntdev_free_map()
133 kvfree(map->map_ops); in gntdev_free_map()
134 kvfree(map->unmap_ops); in gntdev_free_map()
135 kvfree(map->kmap_ops); in gntdev_free_map()
136 kvfree(map->kunmap_ops); in gntdev_free_map()
137 kvfree(map->being_removed); in gntdev_free_map()
138 kfree(map); in gntdev_free_map()
233 struct gntdev_grant_map *map; in gntdev_add_map() local
235 list_for_each_entry(map, &priv->maps, next) { in gntdev_add_map()
236 if (add->index + add->count < map->index) { in gntdev_add_map()
237 list_add_tail(&add->next, &map->next); in gntdev_add_map()
240 add->index = map->index + map->count; in gntdev_add_map()
251 struct gntdev_grant_map *map; in gntdev_find_map_index() local
253 list_for_each_entry(map, &priv->maps, next) { in gntdev_find_map_index()
254 if (map->index != index) in gntdev_find_map_index()
256 if (count && map->count != count) in gntdev_find_map_index()
258 return map; in gntdev_find_map_index()
263 void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map) in gntdev_put_map() argument
265 if (!map) in gntdev_put_map()
268 if (!refcount_dec_and_test(&map->users)) in gntdev_put_map()
271 if (map->pages && !use_ptemod) { in gntdev_put_map()
282 refcount_set(&map->users, 1); in gntdev_put_map()
289 unmap_grant_pages(map, 0, map->count); in gntdev_put_map()
292 if (!refcount_dec_and_test(&map->users)) in gntdev_put_map()
301 if (use_ptemod && map->notifier_init) in gntdev_put_map()
302 mmu_interval_notifier_remove(&map->notifier); in gntdev_put_map()
304 if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) { in gntdev_put_map()
305 notify_remote_via_evtchn(map->notify.event); in gntdev_put_map()
306 evtchn_put(map->notify.event); in gntdev_put_map()
308 gntdev_free_map(map); in gntdev_put_map()
315 struct gntdev_grant_map *map = data; in find_grant_ptes() local
316 unsigned int pgnr = (addr - map->pages_vm_start) >> PAGE_SHIFT; in find_grant_ptes()
317 int flags = map->flags | GNTMAP_application_map | GNTMAP_contains_pte | in find_grant_ptes()
321 BUG_ON(pgnr >= map->count); in find_grant_ptes()
324 gnttab_set_map_op(&map->map_ops[pgnr], pte_maddr, flags, in find_grant_ptes()
325 map->grants[pgnr].ref, in find_grant_ptes()
326 map->grants[pgnr].domid); in find_grant_ptes()
327 gnttab_set_unmap_op(&map->unmap_ops[pgnr], pte_maddr, flags, in find_grant_ptes()
332 int gntdev_map_grant_pages(struct gntdev_grant_map *map) in gntdev_map_grant_pages() argument
339 if (map->map_ops[0].handle != INVALID_GRANT_HANDLE) in gntdev_map_grant_pages()
341 for (i = 0; i < map->count; i++) { in gntdev_map_grant_pages()
343 pfn_to_kaddr(page_to_pfn(map->pages[i])); in gntdev_map_grant_pages()
344 gnttab_set_map_op(&map->map_ops[i], addr, map->flags, in gntdev_map_grant_pages()
345 map->grants[i].ref, in gntdev_map_grant_pages()
346 map->grants[i].domid); in gntdev_map_grant_pages()
347 gnttab_set_unmap_op(&map->unmap_ops[i], addr, in gntdev_map_grant_pages()
348 map->flags, INVALID_GRANT_HANDLE); in gntdev_map_grant_pages()
362 unsigned int flags = (map->flags & ~GNTMAP_device_map) | in gntdev_map_grant_pages()
365 for (i = 0; i < map->count; i++) { in gntdev_map_grant_pages()
367 pfn_to_kaddr(page_to_pfn(map->pages[i])); in gntdev_map_grant_pages()
368 BUG_ON(PageHighMem(map->pages[i])); in gntdev_map_grant_pages()
370 gnttab_set_map_op(&map->kmap_ops[i], address, flags, in gntdev_map_grant_pages()
371 map->grants[i].ref, in gntdev_map_grant_pages()
372 map->grants[i].domid); in gntdev_map_grant_pages()
373 gnttab_set_unmap_op(&map->kunmap_ops[i], address, in gntdev_map_grant_pages()
378 pr_debug("map %d+%d\n", map->index, map->count); in gntdev_map_grant_pages()
379 err = gnttab_map_refs(map->map_ops, map->kmap_ops, map->pages, in gntdev_map_grant_pages()
380 map->count); in gntdev_map_grant_pages()
382 for (i = 0; i < map->count; i++) { in gntdev_map_grant_pages()
383 if (map->map_ops[i].status == GNTST_okay) { in gntdev_map_grant_pages()
384 map->unmap_ops[i].handle = map->map_ops[i].handle; in gntdev_map_grant_pages()
389 if (map->flags & GNTMAP_device_map) in gntdev_map_grant_pages()
390 map->unmap_ops[i].dev_bus_addr = map->map_ops[i].dev_bus_addr; in gntdev_map_grant_pages()
393 if (map->kmap_ops[i].status == GNTST_okay) { in gntdev_map_grant_pages()
395 map->kunmap_ops[i].handle = map->kmap_ops[i].handle; in gntdev_map_grant_pages()
400 atomic_add(alloced, &map->live_grants); in gntdev_map_grant_pages()
408 struct gntdev_grant_map *map = data->data; in __unmap_grant_pages_done() local
409 unsigned int offset = data->unmap_ops - map->unmap_ops; in __unmap_grant_pages_done()
414 if (map->unmap_ops[offset + i].status == GNTST_okay && in __unmap_grant_pages_done()
415 map->unmap_ops[offset + i].handle != INVALID_GRANT_HANDLE) in __unmap_grant_pages_done()
418 WARN_ON(map->unmap_ops[offset + i].status != GNTST_okay && in __unmap_grant_pages_done()
419 map->unmap_ops[offset + i].handle != INVALID_GRANT_HANDLE); in __unmap_grant_pages_done()
421 map->unmap_ops[offset+i].handle, in __unmap_grant_pages_done()
422 map->unmap_ops[offset+i].status); in __unmap_grant_pages_done()
423 map->unmap_ops[offset+i].handle = INVALID_GRANT_HANDLE; in __unmap_grant_pages_done()
425 if (map->kunmap_ops[offset + i].status == GNTST_okay && in __unmap_grant_pages_done()
426 map->kunmap_ops[offset + i].handle != INVALID_GRANT_HANDLE) in __unmap_grant_pages_done()
429 WARN_ON(map->kunmap_ops[offset + i].status != GNTST_okay && in __unmap_grant_pages_done()
430 map->kunmap_ops[offset + i].handle != INVALID_GRANT_HANDLE); in __unmap_grant_pages_done()
432 map->kunmap_ops[offset+i].handle, in __unmap_grant_pages_done()
433 map->kunmap_ops[offset+i].status); in __unmap_grant_pages_done()
434 map->kunmap_ops[offset+i].handle = INVALID_GRANT_HANDLE; in __unmap_grant_pages_done()
442 live_grants = atomic_sub_return(successful_unmaps, &map->live_grants); in __unmap_grant_pages_done()
448 gntdev_put_map(NULL, map); in __unmap_grant_pages_done()
451 static void __unmap_grant_pages(struct gntdev_grant_map *map, int offset, in __unmap_grant_pages() argument
454 if (map->notify.flags & UNMAP_NOTIFY_CLEAR_BYTE) { in __unmap_grant_pages()
455 int pgno = (map->notify.addr >> PAGE_SHIFT); in __unmap_grant_pages()
459 uint8_t *tmp = pfn_to_kaddr(page_to_pfn(map->pages[pgno])); in __unmap_grant_pages()
461 tmp[map->notify.addr & (PAGE_SIZE-1)] = 0; in __unmap_grant_pages()
462 map->notify.flags &= ~UNMAP_NOTIFY_CLEAR_BYTE; in __unmap_grant_pages()
466 map->unmap_data.unmap_ops = map->unmap_ops + offset; in __unmap_grant_pages()
467 map->unmap_data.kunmap_ops = use_ptemod ? map->kunmap_ops + offset : NULL; in __unmap_grant_pages()
468 map->unmap_data.pages = map->pages + offset; in __unmap_grant_pages()
469 map->unmap_data.count = pages; in __unmap_grant_pages()
470 map->unmap_data.done = __unmap_grant_pages_done; in __unmap_grant_pages()
471 map->unmap_data.data = map; in __unmap_grant_pages()
472 refcount_inc(&map->users); /* to keep map alive during async call below */ in __unmap_grant_pages()
474 gnttab_unmap_refs_async(&map->unmap_data); in __unmap_grant_pages()
477 static void unmap_grant_pages(struct gntdev_grant_map *map, int offset, in unmap_grant_pages() argument
482 if (atomic_read(&map->live_grants) == 0) in unmap_grant_pages()
485 pr_debug("unmap %d+%d [%d+%d]\n", map->index, map->count, offset, pages); in unmap_grant_pages()
491 while (pages && map->being_removed[offset]) { in unmap_grant_pages()
497 if (map->being_removed[offset + range]) in unmap_grant_pages()
499 map->being_removed[offset + range] = true; in unmap_grant_pages()
503 __unmap_grant_pages(map, offset, range); in unmap_grant_pages()
513 struct gntdev_grant_map *map = vma->vm_private_data; in gntdev_vma_open() local
516 refcount_inc(&map->users); in gntdev_vma_open()
521 struct gntdev_grant_map *map = vma->vm_private_data; in gntdev_vma_close() local
528 gntdev_put_map(priv, map); in gntdev_vma_close()
534 struct gntdev_grant_map *map = vma->vm_private_data; in gntdev_vma_find_special_page() local
536 return map->pages[(addr - map->pages_vm_start) >> PAGE_SHIFT]; in gntdev_vma_find_special_page()
551 struct gntdev_grant_map *map = in gntdev_invalidate() local
559 map_start = map->pages_vm_start; in gntdev_invalidate()
560 map_end = map->pages_vm_start + (map->count << PAGE_SHIFT); in gntdev_invalidate()
574 map->index, map->count, map_start, map_end, in gntdev_invalidate()
576 unmap_grant_pages(map, (mstart - map_start) >> PAGE_SHIFT, in gntdev_invalidate()
624 struct gntdev_grant_map *map; in gntdev_release() local
631 map = list_entry(priv->maps.next, in gntdev_release()
633 list_del(&map->next); in gntdev_release()
634 gntdev_put_map(NULL /* already removed */, map); in gntdev_release()
658 struct gntdev_grant_map *map; in gntdev_ioctl_map_grant_ref() local
668 map = gntdev_alloc_map(priv, op.count, 0 /* This is not a dma-buf. */); in gntdev_ioctl_map_grant_ref()
669 if (!map) in gntdev_ioctl_map_grant_ref()
672 if (copy_from_user(map->grants, &u->refs, in gntdev_ioctl_map_grant_ref()
673 sizeof(map->grants[0]) * op.count) != 0) { in gntdev_ioctl_map_grant_ref()
674 gntdev_put_map(NULL, map); in gntdev_ioctl_map_grant_ref()
679 gntdev_add_map(priv, map); in gntdev_ioctl_map_grant_ref()
680 op.index = map->index << PAGE_SHIFT; in gntdev_ioctl_map_grant_ref()
693 struct gntdev_grant_map *map; in gntdev_ioctl_unmap_grant_ref() local
701 map = gntdev_find_map_index(priv, op.index >> PAGE_SHIFT, op.count); in gntdev_ioctl_unmap_grant_ref()
702 if (map) { in gntdev_ioctl_unmap_grant_ref()
703 list_del(&map->next); in gntdev_ioctl_unmap_grant_ref()
707 if (map) in gntdev_ioctl_unmap_grant_ref()
708 gntdev_put_map(priv, map); in gntdev_ioctl_unmap_grant_ref()
717 struct gntdev_grant_map *map; in gntdev_ioctl_get_offset_for_vaddr() local
729 map = vma->vm_private_data; in gntdev_ioctl_get_offset_for_vaddr()
730 if (!map) in gntdev_ioctl_get_offset_for_vaddr()
733 op.offset = map->index << PAGE_SHIFT; in gntdev_ioctl_get_offset_for_vaddr()
734 op.count = map->count; in gntdev_ioctl_get_offset_for_vaddr()
748 struct gntdev_grant_map *map; in gntdev_ioctl_notify() local
776 list_for_each_entry(map, &priv->maps, next) { in gntdev_ioctl_notify()
777 uint64_t begin = map->index << PAGE_SHIFT; in gntdev_ioctl_notify()
778 uint64_t end = (map->index + map->count) << PAGE_SHIFT; in gntdev_ioctl_notify()
787 (map->flags & GNTMAP_readonly)) { in gntdev_ioctl_notify()
792 out_flags = map->notify.flags; in gntdev_ioctl_notify()
793 out_event = map->notify.event; in gntdev_ioctl_notify()
795 map->notify.flags = op.action; in gntdev_ioctl_notify()
796 map->notify.addr = op.index - (map->index << PAGE_SHIFT); in gntdev_ioctl_notify()
797 map->notify.event = op.event_channel_port; in gntdev_ioctl_notify()
1067 struct gntdev_grant_map *map; in gntdev_mmap() local
1077 map = gntdev_find_map_index(priv, index, count); in gntdev_mmap()
1078 if (!map) in gntdev_mmap()
1080 if (!atomic_add_unless(&map->in_use, 1, 1)) in gntdev_mmap()
1083 refcount_inc(&map->users); in gntdev_mmap()
1092 vma->vm_private_data = map; in gntdev_mmap()
1093 if (map->flags) { in gntdev_mmap()
1095 (map->flags & GNTMAP_readonly)) in gntdev_mmap()
1098 map->flags = GNTMAP_host_map; in gntdev_mmap()
1100 map->flags |= GNTMAP_readonly; in gntdev_mmap()
1103 map->pages_vm_start = vma->vm_start; in gntdev_mmap()
1107 &map->notifier, vma->vm_mm, vma->vm_start, in gntdev_mmap()
1112 map->notifier_init = true; in gntdev_mmap()
1127 mmu_interval_read_begin(&map->notifier); in gntdev_mmap()
1131 find_grant_ptes, map); in gntdev_mmap()
1138 err = gntdev_map_grant_pages(map); in gntdev_mmap()
1143 err = vm_map_pages_zero(vma, map->pages, map->count); in gntdev_mmap()
1158 unmap_grant_pages(map, 0, map->count); in gntdev_mmap()
1159 gntdev_put_map(priv, map); in gntdev_mmap()