]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/virtio: Support partial maps of GEM objects
authorSasha Finkelstein <fnkl.kernel@gmail.com>
Thu, 9 Jan 2025 21:45:46 +0000 (22:45 +0100)
committerDmitry Osipenko <dmitry.osipenko@collabora.com>
Fri, 24 Jan 2025 21:16:57 +0000 (00:16 +0300)
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]

drivers/gpu/drm/virtio/virtgpu_vram.c

index 25df81c027837c248a746e41856b5aa7e216b8d5..5ad3b7c6f73c360b32f23560393d03283b1ab4f8 100644 (file)
@@ -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;
 }