mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	drm/virtio: Support partial maps of GEM objects
Those are useful to implement coherent cross-vm mmap. Signed-off-by: Sasha Finkelstein <fnkl.kernel@gmail.com> Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250109-virtgpu-gem-partial-map-v1-1-a914b48776bd@gmail.com Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> [dmitry.osipenko@collabora.com: Corrected vm_size check to account vm_pgoff]
This commit is contained in:
		
							parent
							
								
									3ab334814d
								
							
						
					
					
						commit
						7f3b11934f
					
				
					 1 changed files with 6 additions and 3 deletions
				
			
		|  | @ -37,6 +37,7 @@ static int virtio_gpu_vram_mmap(struct drm_gem_object *obj, | ||||||
| 	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); | 	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); | ||||||
| 	struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo); | 	struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo); | ||||||
| 	unsigned long vm_size = vma->vm_end - vma->vm_start; | 	unsigned long vm_size = vma->vm_end - vma->vm_start; | ||||||
|  | 	unsigned long vm_end; | ||||||
| 
 | 
 | ||||||
| 	if (!(bo->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE)) | 	if (!(bo->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
|  | @ -56,12 +57,14 @@ static int virtio_gpu_vram_mmap(struct drm_gem_object *obj, | ||||||
| 	else if (vram->map_info == VIRTIO_GPU_MAP_CACHE_UNCACHED) | 	else if (vram->map_info == VIRTIO_GPU_MAP_CACHE_UNCACHED) | ||||||
| 		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | 		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | ||||||
| 
 | 
 | ||||||
| 	/* Partial mappings of GEM buffers don't happen much in practice. */ | 	if (check_add_overflow(vma->vm_pgoff << PAGE_SHIFT, vm_size, &vm_end)) | ||||||
| 	if (vm_size != vram->vram_node.size) | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	if (vm_end > vram->vram_node.size) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	ret = io_remap_pfn_range(vma, vma->vm_start, | 	ret = io_remap_pfn_range(vma, vma->vm_start, | ||||||
| 				 vram->vram_node.start >> PAGE_SHIFT, | 				 (vram->vram_node.start >> PAGE_SHIFT) + vma->vm_pgoff, | ||||||
| 				 vm_size, vma->vm_page_prot); | 				 vm_size, vma->vm_page_prot); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Sasha Finkelstein
						Sasha Finkelstein