[PATCH v5 0/5] drm/virtio: Import scanout buffers from other devices
Kasireddy, Vivek
vivek.kasireddy at intel.com
Wed Nov 27 06:30:28 UTC 2024
Hi Dmitry,
> Subject: Re: [PATCH v5 0/5] drm/virtio: Import scanout buffers from other
> devices
>
> Hello, Vivek
>
> All patches applied to misc-next with a small modification, thanks!
Thank you so much for taking the time to test, review and merge this series!!
>
> Note: While verifying move_notify(), I noticed that AMD/TTM driver moves
> same shared FB GEMs after each framebuffer update when it renders into
> FB, despite of the 32GB BAR. This should be rather inefficient. I'd
> expect dma-buf staying static if there is no need to evict it. Something
> to check how it works with DG2.
IIUC, I think the exporting driver (AMD GPU driver) in the Guest VM migrates the
FB to System RAM because during export it determines that virtio-gpu is not P2P
compatible. This behavior is expected and seen with other dGPU drivers (i915/Xe)
as well. However, I am trying to fix this in Xe driver for specific use-cases (SRIOV)
where we know for sure that the importer on the Host is another dGPU:
https://patchwork.kernel.org/project/dri-devel/cover/20241012024524.1377836-1-vivek.kasireddy@intel.com/
https://patchwork.kernel.org/project/dri-devel/cover/20240624065552.1572580-1-vivek.kasireddy@intel.com/
>
> Fix: I made this change to the "Import prime buffers" patch after
> spotting possibility of having race condition between move_notify() and
> freeing GEM:
This fix LGTM.
Thanks,
Vivek
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c
> b/drivers/gpu/drm/virtio/virtgpu_prime.c
> index 8644b87d473d..688810d1b611 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_prime.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_prime.c
> @@ -189,13 +189,18 @@ static void virtgpu_dma_buf_free_obj(struct
> drm_gem_object *obj)
> struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
> struct virtio_gpu_device *vgdev = obj->dev->dev_private;
> struct dma_buf_attachment *attach = obj->import_attach;
> + struct dma_resv *resv = attach->dmabuf->resv;
>
> if (attach) {
> + dma_resv_lock(resv, NULL);
> +
> virtio_gpu_detach_object_fenced(bo);
>
> if (bo->sgt)
> - dma_buf_unmap_attachment_unlocked(attach, bo-
> >sgt,
> -
> DMA_BIDIRECTIONAL);
> + dma_buf_unmap_attachment(attach, bo->sgt,
> + DMA_BIDIRECTIONAL);
> +
> + dma_resv_unlock(resv);
>
> dma_buf_detach(attach->dmabuf, attach);
> dma_buf_put(attach->dmabuf);
> @@ -268,7 +273,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) {
> + if (bo->created && kref_read(&obj->refcount)) {
> virtio_gpu_detach_object_fenced(bo);
>
> if (bo->sgt)
>
>
> --
> Best regards,
> Dmitry
More information about the dri-devel
mailing list