drm/virtio: Factor out common dmabuf unmapping code
authorDmitry Osipenko <dmitry.osipenko@collabora.com>
Mon, 2 Dec 2024 05:39:55 +0000 (08:39 +0300)
committerDmitry Osipenko <dmitry.osipenko@collabora.com>
Thu, 9 Jan 2025 13:53:24 +0000 (16:53 +0300)
Move out dmabuf detachment and unmapping into separate function. This
removes duplicated code and there is no need to check the GEM's kref now,
since both bo->attached and bo->sgt are unset under held reservation lock.

Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Acked-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241202053955.2451321-1-dmitry.osipenko@collabora.com
drivers/gpu/drm/virtio/virtgpu_prime.c

index 4837076308615b836699118ac567e131f4d06fd8..fe6a0b018571751f85d45b19997efb3cf6368176 100644 (file)
@@ -184,6 +184,23 @@ int virtgpu_dma_buf_import_sgt(struct virtio_gpu_mem_entry **ents,
        return 0;
 }
 
+static void virtgpu_dma_buf_unmap(struct virtio_gpu_object *bo)
+{
+       struct dma_buf_attachment *attach = bo->base.base.import_attach;
+
+       dma_resv_assert_held(attach->dmabuf->resv);
+
+       if (bo->created) {
+               virtio_gpu_detach_object_fenced(bo);
+
+               if (bo->sgt)
+                       dma_buf_unmap_attachment(attach, bo->sgt,
+                                                DMA_BIDIRECTIONAL);
+
+               bo->sgt = NULL;
+       }
+}
+
 static void virtgpu_dma_buf_free_obj(struct drm_gem_object *obj)
 {
        struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
@@ -194,13 +211,7 @@ static void virtgpu_dma_buf_free_obj(struct drm_gem_object *obj)
                struct dma_buf *dmabuf = attach->dmabuf;
 
                dma_resv_lock(dmabuf->resv, NULL);
-
-               virtio_gpu_detach_object_fenced(bo);
-
-               if (bo->sgt)
-                       dma_buf_unmap_attachment(attach, bo->sgt,
-                                                DMA_BIDIRECTIONAL);
-
+               virtgpu_dma_buf_unmap(bo);
                dma_resv_unlock(dmabuf->resv);
 
                dma_buf_detach(dmabuf, attach);
@@ -273,15 +284,7 @@ static void virtgpu_dma_buf_move_notify(struct dma_buf_attachment *attach)
        struct drm_gem_object *obj = attach->importer_priv;
        struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
 
-       if (bo->created && kref_read(&obj->refcount)) {
-               virtio_gpu_detach_object_fenced(bo);
-
-               if (bo->sgt)
-                       dma_buf_unmap_attachment(attach, bo->sgt,
-                                                DMA_BIDIRECTIONAL);
-
-               bo->sgt = NULL;
-       }
+       virtgpu_dma_buf_unmap(bo);
 }
 
 static const struct dma_buf_attach_ops virtgpu_dma_buf_attach_ops = {