The original code did not properly release the dma_fence `next` in case
amdgpu_ttm_fill_mem failed during buffer clearing.

Signed-off-by: Li Ma <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 9c5df35f05b7..b7284f0a5ac0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -2296,6 +2296,7 @@ int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo,
        struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
        struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
        struct amdgpu_res_cursor cursor;
+       struct dma_fence *next = NULL;
        u64 addr;
        int r = 0;
 
@@ -2311,7 +2312,6 @@ int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo,
 
        mutex_lock(&adev->mman.gtt_window_lock);
        while (cursor.remaining) {
-               struct dma_fence *next = NULL;
                u64 size;
 
                if (amdgpu_res_cleared(&cursor)) {
@@ -2334,10 +2334,13 @@ int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo,
 
                dma_fence_put(*fence);
                *fence = next;
+               next = NULL;
 
                amdgpu_res_next(&cursor, size);
        }
 err:
+       if (next)
+               dma_fence_put(next);
        mutex_unlock(&adev->mman.gtt_window_lock);
 
        return r;
-- 
2.25.1

Reply via email to