commit 4220d2c7c41b ("drm/amdgpu: remove is_mes_queue flag") set
ring->adev->ring[ring-idx] as NULL at the end of function amdgpu_ring_fini()
which will cause function amdgpu_fence_driver_sw_fini() skip
drm_sched_fini() and free fence_drv.fence then cause memory leak.

Release these resource at the beginning of amdgpu_ring_fini() to fix
this issue.

Fixes: 4220d2c7c41b ("drm/amdgpu: remove is_mes_queue flag")
Signed-off-by: Lin.Cao <linca...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 6379bb25bf5c..cf6f19a122df 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -406,6 +406,19 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)
 
        ring->sched.ready = false;
 
+       if (ring->fence_drv.initialized) {
+               int i = 0;
+
+               if (ring->sched.ops)
+                       drm_sched_fini(&ring->sched);
+
+               for (i = 0; i <= ring->fence_drv.num_fences_mask; ++i)
+                       dma_fence_put(ring->fence_drv.fences[i]);
+               kfree(ring->fence_drv.fences);
+               ring->fence_drv.fences = NULL;
+               ring->fence_drv.initialized = false;
+       }
+
        amdgpu_device_wb_free(ring->adev, ring->rptr_offs);
        amdgpu_device_wb_free(ring->adev, ring->wptr_offs);
 
-- 
2.46.1

Reply via email to