]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/virtio: Fix flickering issue seen with imported dmabufs
authorVivek Kasireddy <vivek.kasireddy@intel.com>
Tue, 25 Mar 2025 20:10:21 +0000 (13:10 -0700)
committerDmitry Osipenko <dmitry.osipenko@collabora.com>
Wed, 26 Mar 2025 20:59:41 +0000 (23:59 +0300)
We need to save the reservation object pointer associated with the
imported dmabuf in the newly created GEM object to allow
drm_gem_plane_helper_prepare_fb() to extract the exclusive fence
from it and attach it to the plane state during prepare phase.
This is needed to ensure that drm_atomic_helper_wait_for_fences()
correctly waits for the relevant fences (move, etc) associated with
the reservation object, thereby implementing proper synchronization.

Otherwise, artifacts or slight flickering can be seen when apps
are dragged across the screen when running Gnome (Wayland). This
problem is mostly seen with dGPUs in the case where the FBs are
allocated in VRAM but need to be migrated to System RAM as they
are shared with virtio-gpu.

Fixes: ca77f27a2665 ("drm/virtio: Import prime buffers from other devices as guest blobs")
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Chia-I Wu <olvaffe@gmail.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
[dmitry.osipenko@collabora.com: Moved assignment before object_init()]
Link: https://patchwork.freedesktop.org/patch/msgid/20250325201021.1315080-1-vivek.kasireddy@intel.com
drivers/gpu/drm/virtio/virtgpu_prime.c

index f92133a01195a95f9a2bd386a8aee78fd718de08..d28d1c45a703b58b630fba15b64d3f9c6b12b90d 100644 (file)
@@ -319,6 +319,7 @@ struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
                return ERR_PTR(-ENOMEM);
 
        obj = &bo->base.base;
+       obj->resv = buf->resv;
        obj->funcs = &virtgpu_gem_dma_buf_funcs;
        drm_gem_private_object_init(dev, obj, buf->size);