Lines Matching refs:domain
20 static int vduse_iotlb_add_range(struct vduse_iova_domain *domain,
35 ret = vhost_iotlb_add_range_ctx(domain->iotlb, start, last,
45 static void vduse_iotlb_del_range(struct vduse_iova_domain *domain,
51 while ((map = vhost_iotlb_itree_first(domain->iotlb, start, last))) {
55 vhost_iotlb_map_free(domain->iotlb, map);
59 int vduse_domain_set_map(struct vduse_iova_domain *domain,
67 spin_lock(&domain->iotlb_lock);
68 vduse_iotlb_del_range(domain, start, last);
73 ret = vduse_iotlb_add_range(domain, map->start, map->last,
80 spin_unlock(&domain->iotlb_lock);
84 vduse_iotlb_del_range(domain, start, last);
85 spin_unlock(&domain->iotlb_lock);
89 void vduse_domain_clear_map(struct vduse_iova_domain *domain,
95 spin_lock(&domain->iotlb_lock);
98 vduse_iotlb_del_range(domain, map->start, map->last);
100 spin_unlock(&domain->iotlb_lock);
103 static int vduse_domain_map_bounce_page(struct vduse_iova_domain *domain,
110 map = &domain->bounce_maps[iova >> PAGE_SHIFT];
123 static void vduse_domain_unmap_bounce_page(struct vduse_iova_domain *domain,
130 map = &domain->bounce_maps[iova >> PAGE_SHIFT];
160 static void vduse_domain_bounce(struct vduse_iova_domain *domain,
169 if (iova >= domain->bounce_size)
173 map = &domain->bounce_maps[iova >> PAGE_SHIFT];
190 vduse_domain_get_coherent_page(struct vduse_iova_domain *domain, u64 iova)
197 spin_lock(&domain->iotlb_lock);
198 map = vhost_iotlb_itree_first(domain->iotlb, start, last);
205 spin_unlock(&domain->iotlb_lock);
211 vduse_domain_get_bounce_page(struct vduse_iova_domain *domain, u64 iova)
216 read_lock(&domain->bounce_lock);
217 map = &domain->bounce_maps[iova >> PAGE_SHIFT];
218 if (domain->user_bounce_pages || !map->bounce_page)
224 read_unlock(&domain->bounce_lock);
230 vduse_domain_free_kernel_bounce_pages(struct vduse_iova_domain *domain)
235 bounce_pfns = domain->bounce_size >> PAGE_SHIFT;
238 map = &domain->bounce_maps[pfn];
250 int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain,
257 if (count != (domain->bounce_size >> PAGE_SHIFT))
260 write_lock(&domain->bounce_lock);
262 if (domain->user_bounce_pages)
266 map = &domain->bounce_maps[i];
278 domain->user_bounce_pages = true;
281 write_unlock(&domain->bounce_lock);
286 void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *domain)
291 write_lock(&domain->bounce_lock);
292 if (!domain->user_bounce_pages)
295 count = domain->bounce_size >> PAGE_SHIFT;
299 map = &domain->bounce_maps[i];
312 domain->user_bounce_pages = false;
314 write_unlock(&domain->bounce_lock);
317 void vduse_domain_reset_bounce_map(struct vduse_iova_domain *domain)
319 if (!domain->bounce_map)
322 spin_lock(&domain->iotlb_lock);
323 if (!domain->bounce_map)
326 vduse_iotlb_del_range(domain, 0, domain->bounce_size - 1);
327 domain->bounce_map = 0;
329 spin_unlock(&domain->iotlb_lock);
332 static int vduse_domain_init_bounce_map(struct vduse_iova_domain *domain)
336 if (domain->bounce_map)
339 spin_lock(&domain->iotlb_lock);
340 if (domain->bounce_map)
343 ret = vduse_iotlb_add_range(domain, 0, domain->bounce_size - 1,
344 0, VHOST_MAP_RW, domain->file, 0);
348 domain->bounce_map = 1;
350 spin_unlock(&domain->iotlb_lock);
376 dma_addr_t vduse_domain_map_page(struct vduse_iova_domain *domain,
381 struct iova_domain *iovad = &domain->stream_iovad;
382 unsigned long limit = domain->bounce_size - 1;
389 if (vduse_domain_init_bounce_map(domain))
392 read_lock(&domain->bounce_lock);
393 if (vduse_domain_map_bounce_page(domain, (u64)iova, (u64)size, pa))
397 vduse_domain_bounce(domain, iova, size, DMA_TO_DEVICE);
399 read_unlock(&domain->bounce_lock);
403 read_unlock(&domain->bounce_lock);
409 void vduse_domain_unmap_page(struct vduse_iova_domain *domain,
413 struct iova_domain *iovad = &domain->stream_iovad;
415 read_lock(&domain->bounce_lock);
417 vduse_domain_bounce(domain, dma_addr, size, DMA_FROM_DEVICE);
419 vduse_domain_unmap_bounce_page(domain, (u64)dma_addr, (u64)size);
420 read_unlock(&domain->bounce_lock);
424 void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain,
428 struct iova_domain *iovad = &domain->consistent_iovad;
429 unsigned long limit = domain->iova_limit;
436 spin_lock(&domain->iotlb_lock);
437 if (vduse_iotlb_add_range(domain, (u64)iova, (u64)iova + size - 1,
439 domain->file, (u64)iova)) {
440 spin_unlock(&domain->iotlb_lock);
443 spin_unlock(&domain->iotlb_lock);
458 void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
462 struct iova_domain *iovad = &domain->consistent_iovad;
467 spin_lock(&domain->iotlb_lock);
468 map = vhost_iotlb_itree_first(domain->iotlb, (u64)dma_addr,
471 spin_unlock(&domain->iotlb_lock);
478 vhost_iotlb_map_free(domain->iotlb, map);
479 spin_unlock(&domain->iotlb_lock);
487 struct vduse_iova_domain *domain = vmf->vma->vm_private_data;
491 if (!domain)
494 if (iova < domain->bounce_size)
495 page = vduse_domain_get_bounce_page(domain, iova);
497 page = vduse_domain_get_coherent_page(domain, iova);
513 struct vduse_iova_domain *domain = file->private_data;
516 vma->vm_private_data = domain;
524 struct vduse_iova_domain *domain = file->private_data;
526 spin_lock(&domain->iotlb_lock);
527 vduse_iotlb_del_range(domain, 0, ULLONG_MAX);
528 vduse_domain_remove_user_bounce_pages(domain);
529 vduse_domain_free_kernel_bounce_pages(domain);
530 spin_unlock(&domain->iotlb_lock);
531 put_iova_domain(&domain->stream_iovad);
532 put_iova_domain(&domain->consistent_iovad);
533 vhost_iotlb_free(domain->iotlb);
534 vfree(domain->bounce_maps);
535 kfree(domain);
546 void vduse_domain_destroy(struct vduse_iova_domain *domain)
548 fput(domain->file);
554 struct vduse_iova_domain *domain;
564 domain = kzalloc(sizeof(*domain), GFP_KERNEL);
565 if (!domain)
568 domain->iotlb = vhost_iotlb_alloc(0, 0);
569 if (!domain->iotlb)
572 domain->iova_limit = iova_limit;
573 domain->bounce_size = PAGE_ALIGN(bounce_size);
574 domain->bounce_maps = vzalloc(bounce_pfns *
576 if (!domain->bounce_maps)
580 map = &domain->bounce_maps[pfn];
583 file = anon_inode_getfile("[vduse-domain]", &vduse_domain_fops,
584 domain, O_RDWR);
588 domain->file = file;
589 rwlock_init(&domain->bounce_lock);
590 spin_lock_init(&domain->iotlb_lock);
591 init_iova_domain(&domain->stream_iovad,
593 ret = iova_domain_init_rcaches(&domain->stream_iovad);
596 init_iova_domain(&domain->consistent_iovad,
598 ret = iova_domain_init_rcaches(&domain->consistent_iovad);
602 return domain;
604 put_iova_domain(&domain->stream_iovad);
608 vfree(domain->bounce_maps);
610 vhost_iotlb_free(domain->iotlb);
612 kfree(domain);