mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +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_vram *vram = to_virtio_gpu_vram(bo);
|
||||
unsigned long vm_size = vma->vm_end - vma->vm_start;
|
||||
unsigned long vm_end;
|
||||
|
||||
if (!(bo->blob_flags & VIRTGPU_BLOB_FLAG_USE_MAPPABLE))
|
||||
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)
|
||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
|
||||
/* Partial mappings of GEM buffers don't happen much in practice. */
|
||||
if (vm_size != vram->vram_node.size)
|
||||
if (check_add_overflow(vma->vm_pgoff << PAGE_SHIFT, vm_size, &vm_end))
|
||||
return -EINVAL;
|
||||
|
||||
if (vm_end > vram->vram_node.size)
|
||||
return -EINVAL;
|
||||
|
||||
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);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue