accel/ivpu: Free buffer sgt on unbind
authorJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Mon, 15 Jan 2024 13:44:31 +0000 (14:44 +0100)
committerJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Mon, 22 Jan 2024 09:28:46 +0000 (10:28 +0100)
Call dma_unmap() on all buffers before the VPU is unbinded to avoid
"device driver has pending DMA allocations while released from device"
warning when DMA-API debug is enabled.

Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240115134434.493839-7-jacek.lawrynowicz@linux.intel.com
drivers/accel/ivpu/ivpu_gem.c

index 6890d33cf3528014de1ef8d1e6491898d00be20e..4de454bfbf917e352e7000c2f69889e1dd4d9ac2 100644 (file)
@@ -112,8 +112,6 @@ static void ivpu_bo_unbind_locked(struct ivpu_bo *bo)
 
        ivpu_dbg_bo(vdev, bo, "unbind");
 
-       /* TODO: dma_unmap */
-
        if (bo->mmu_mapped) {
                drm_WARN_ON(&vdev->drm, !bo->ctx);
                drm_WARN_ON(&vdev->drm, !bo->vpu_addr);
@@ -127,6 +125,18 @@ static void ivpu_bo_unbind_locked(struct ivpu_bo *bo)
                bo->vpu_addr = 0;
                bo->ctx = NULL;
        }
+
+       if (bo->base.base.import_attach)
+               return;
+
+       dma_resv_lock(bo->base.base.resv, NULL);
+       if (bo->base.sgt) {
+               dma_unmap_sgtable(vdev->drm.dev, bo->base.sgt, DMA_BIDIRECTIONAL, 0);
+               sg_free_table(bo->base.sgt);
+               kfree(bo->base.sgt);
+               bo->base.sgt = NULL;
+       }
+       dma_resv_unlock(bo->base.base.resv);
 }
 
 static void ivpu_bo_unbind(struct ivpu_bo *bo)