Lines Matching defs:map
67 static void unmap_grant_pages(struct gntdev_grant_map *map,
83 struct gntdev_grant_map *map;
86 list_for_each_entry(map, &priv->maps, next)
88 map->index, map->count,
89 map->index == text_index && text ? text : "");
93 static void gntdev_free_map(struct gntdev_grant_map *map)
95 if (map == NULL)
99 if (map->dma_vaddr) {
102 args.dev = map->dma_dev;
103 args.coherent = !!(map->dma_flags & GNTDEV_DMA_FLAG_COHERENT);
104 args.nr_pages = map->count;
105 args.pages = map->pages;
106 args.frames = map->frames;
107 args.vaddr = map->dma_vaddr;
108 args.dev_bus_addr = map->dma_bus_addr;
113 if (map->pages)
114 gnttab_free_pages(map->count, map->pages);
117 kvfree(map->frames);
119 kvfree(map->pages);
120 kvfree(map->grants);
121 kvfree(map->map_ops);
122 kvfree(map->unmap_ops);
123 kvfree(map->kmap_ops);
124 kvfree(map->kunmap_ops);
125 kvfree(map->being_removed);
126 kfree(map);
211 struct gntdev_grant_map *map;
213 list_for_each_entry(map, &priv->maps, next) {
214 if (add->index + add->count < map->index) {
215 list_add_tail(&add->next, &map->next);
218 add->index = map->index + map->count;
229 struct gntdev_grant_map *map;
231 list_for_each_entry(map, &priv->maps, next) {
232 if (map->index != index)
234 if (count && map->count != count)
236 return map;
241 void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map)
243 if (!map)
246 if (!refcount_dec_and_test(&map->users))
249 if (map->pages && !use_ptemod) {
260 refcount_set(&map->users, 1);
267 unmap_grant_pages(map, 0, map->count);
270 if (!refcount_dec_and_test(&map->users))
275 * map.
279 if (use_ptemod && map->notifier_init)
280 mmu_interval_notifier_remove(&map->notifier);
282 if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
283 notify_remote_via_evtchn(map->notify.event);
284 evtchn_put(map->notify.event);
286 gntdev_free_map(map);
293 struct gntdev_grant_map *map = data;
294 unsigned int pgnr = (addr - map->pages_vm_start) >> PAGE_SHIFT;
295 int flags = map->flags | GNTMAP_application_map | GNTMAP_contains_pte |
299 BUG_ON(pgnr >= map->count);
302 gnttab_set_map_op(&map->map_ops[pgnr], pte_maddr, flags,
303 map->grants[pgnr].ref,
304 map->grants[pgnr].domid);
305 gnttab_set_unmap_op(&map->unmap_ops[pgnr], pte_maddr, flags,
310 int gntdev_map_grant_pages(struct gntdev_grant_map *map)
317 if (map->map_ops[0].handle != -1)
319 for (i = 0; i < map->count; i++) {
321 pfn_to_kaddr(page_to_pfn(map->pages[i]));
322 gnttab_set_map_op(&map->map_ops[i], addr, map->flags,
323 map->grants[i].ref,
324 map->grants[i].domid);
325 gnttab_set_unmap_op(&map->unmap_ops[i], addr,
326 map->flags, -1 /* handle */);
340 unsigned int flags = (map->flags & ~GNTMAP_device_map) |
343 for (i = 0; i < map->count; i++) {
345 pfn_to_kaddr(page_to_pfn(map->pages[i]));
346 BUG_ON(PageHighMem(map->pages[i]));
348 gnttab_set_map_op(&map->kmap_ops[i], address, flags,
349 map->grants[i].ref,
350 map->grants[i].domid);
351 gnttab_set_unmap_op(&map->kunmap_ops[i], address,
356 pr_debug("map %d+%d\n", map->index, map->count);
357 err = gnttab_map_refs(map->map_ops, use_ptemod ? map->kmap_ops : NULL,
358 map->pages, map->count);
360 for (i = 0; i < map->count; i++) {
361 if (map->map_ops[i].status == GNTST_okay) {
362 map->unmap_ops[i].handle = map->map_ops[i].handle;
367 if (map->flags & GNTMAP_device_map)
368 map->unmap_ops[i].dev_bus_addr = map->map_ops[i].dev_bus_addr;
371 if (map->kmap_ops[i].status == GNTST_okay) {
373 map->kunmap_ops[i].handle = map->kmap_ops[i].handle;
378 atomic_add(alloced, &map->live_grants);
386 struct gntdev_grant_map *map = data->data;
387 unsigned int offset = data->unmap_ops - map->unmap_ops;
392 if (map->unmap_ops[offset + i].status == GNTST_okay &&
393 map->unmap_ops[offset + i].handle != -1)
396 WARN_ON(map->unmap_ops[offset+i].status &&
397 map->unmap_ops[offset+i].handle != -1);
399 map->unmap_ops[offset+i].handle,
400 map->unmap_ops[offset+i].status);
401 map->unmap_ops[offset+i].handle = -1;
403 if (map->kunmap_ops[offset + i].status == GNTST_okay &&
404 map->kunmap_ops[offset + i].handle != -1)
407 WARN_ON(map->kunmap_ops[offset+i].status &&
408 map->kunmap_ops[offset+i].handle != -1);
410 map->kunmap_ops[offset+i].handle,
411 map->kunmap_ops[offset+i].status);
412 map->kunmap_ops[offset+i].handle = -1;
420 live_grants = atomic_sub_return(successful_unmaps, &map->live_grants);
426 gntdev_put_map(NULL, map);
429 static void __unmap_grant_pages(struct gntdev_grant_map *map, int offset,
432 if (map->notify.flags & UNMAP_NOTIFY_CLEAR_BYTE) {
433 int pgno = (map->notify.addr >> PAGE_SHIFT);
437 uint8_t *tmp = pfn_to_kaddr(page_to_pfn(map->pages[pgno]));
439 tmp[map->notify.addr & (PAGE_SIZE-1)] = 0;
440 map->notify.flags &= ~UNMAP_NOTIFY_CLEAR_BYTE;
444 map->unmap_data.unmap_ops = map->unmap_ops + offset;
445 map->unmap_data.kunmap_ops = use_ptemod ? map->kunmap_ops + offset : NULL;
446 map->unmap_data.pages = map->pages + offset;
447 map->unmap_data.count = pages;
448 map->unmap_data.done = __unmap_grant_pages_done;
449 map->unmap_data.data = map;
450 refcount_inc(&map->users); /* to keep map alive during async call below */
452 gnttab_unmap_refs_async(&map->unmap_data);
455 static void unmap_grant_pages(struct gntdev_grant_map *map, int offset,
460 if (atomic_read(&map->live_grants) == 0)
463 pr_debug("unmap %d+%d [%d+%d]\n", map->index, map->count, offset, pages);
469 while (pages && map->being_removed[offset]) {
475 if (map->being_removed[offset + range])
477 map->being_removed[offset + range] = true;
481 __unmap_grant_pages(map, offset, range);
491 struct gntdev_grant_map *map = vma->vm_private_data;
494 refcount_inc(&map->users);
499 struct gntdev_grant_map *map = vma->vm_private_data;
506 gntdev_put_map(priv, map);
512 struct gntdev_grant_map *map = vma->vm_private_data;
514 return map->pages[(addr - map->pages_vm_start) >> PAGE_SHIFT];
529 struct gntdev_grant_map *map =
537 map_start = map->pages_vm_start;
538 map_end = map->pages_vm_start + (map->count << PAGE_SHIFT);
551 pr_debug("map %d+%d (%lx %lx), range %lx %lx, mrange %lx %lx\n",
552 map->index, map->count, map_start, map_end,
554 unmap_grant_pages(map, (mstart - map_start) >> PAGE_SHIFT,
600 struct gntdev_grant_map *map;
606 map = list_entry(priv->maps.next,
608 list_del(&map->next);
609 gntdev_put_map(NULL /* already removed */, map);
625 struct gntdev_grant_map *map;
635 map = gntdev_alloc_map(priv, op.count, 0 /* This is not a dma-buf. */);
636 if (!map)
639 if (copy_from_user(map->grants, &u->refs,
640 sizeof(map->grants[0]) * op.count) != 0) {
641 gntdev_put_map(NULL, map);
646 gntdev_add_map(priv, map);
647 op.index = map->index << PAGE_SHIFT;
660 struct gntdev_grant_map *map;
668 map = gntdev_find_map_index(priv, op.index >> PAGE_SHIFT, op.count);
669 if (map) {
670 list_del(&map->next);
674 if (map)
675 gntdev_put_map(priv, map);
684 struct gntdev_grant_map *map;
696 map = vma->vm_private_data;
697 if (!map)
700 op.offset = map->index << PAGE_SHIFT;
701 op.count = map->count;
715 struct gntdev_grant_map *map;
743 list_for_each_entry(map, &priv->maps, next) {
744 uint64_t begin = map->index << PAGE_SHIFT;
745 uint64_t end = (map->index + map->count) << PAGE_SHIFT;
754 (map->flags & GNTMAP_readonly)) {
759 out_flags = map->notify.flags;
760 out_event = map->notify.event;
762 map->notify.flags = op.action;
763 map->notify.addr = op.index - (map->index << PAGE_SHIFT);
764 map->notify.event = op.event_channel_port;
771 /* Drop the reference to the event channel we did not save in the map */
1028 struct gntdev_grant_map *map;
1034 pr_debug("map %d+%d at %lx (pgoff %lx)\n",
1038 map = gntdev_find_map_index(priv, index, count);
1039 if (!map)
1041 if (!atomic_add_unless(&map->in_use, 1, 1))
1044 refcount_inc(&map->users);
1053 vma->vm_private_data = map;
1054 if (map->flags) {
1056 (map->flags & GNTMAP_readonly))
1059 map->flags = GNTMAP_host_map;
1061 map->flags |= GNTMAP_readonly;
1064 map->pages_vm_start = vma->vm_start;
1068 &map->notifier, vma->vm_mm, vma->vm_start,
1073 map->notifier_init = true;
1088 mmu_interval_read_begin(&map->notifier);
1092 find_grant_ptes, map);
1099 err = gntdev_map_grant_pages(map);
1104 err = vm_map_pages_zero(vma, map->pages, map->count);
1119 unmap_grant_pages(map, 0, map->count);
1120 gntdev_put_map(priv, map);