Set the dirty bit when the memory resource is not cleared
during BO release.

Signed-off-by: Arunpravin Paneer Selvam <arunpravin.paneersel...@amd.com>
Suggested-by: Christian König <christian.koe...@amd.com>
Cc: sta...@vger.kernel.org
Fixes: a68c7eaa7a8f ("drm/amdgpu: Enable clear page functionality")
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c   | 26 ++++++++++++++------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c      |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h |  7 ++++--
 3 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 73403744331a..ea6ce53c3a44 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -1302,28 +1302,40 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object 
*bo)
         * So when this locking here fails something is wrong with the reference
         * counting.
         */
-       if (WARN_ON_ONCE(!dma_resv_trylock(&bo->base._resv)))
+       if (WARN_ON_ONCE(!dma_resv_trylock(&bo->base._resv))) {
+               if (bo->resource && bo->resource->mem_type == TTM_PL_VRAM)
+                       amdgpu_vram_mgr_set_clear_state(bo->resource, false);
+
                return;
+       }
 
        amdgpu_amdkfd_remove_all_eviction_fences(abo);
 
-       if (!bo->resource || bo->resource->mem_type != TTM_PL_VRAM ||
-           !(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE) ||
-           adev->in_suspend || drm_dev_is_unplugged(adev_to_drm(adev)))
+       if (!bo->resource || bo->resource->mem_type != TTM_PL_VRAM)
                goto out;
 
+       if (!(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE) ||
+           adev->in_suspend || drm_dev_is_unplugged(adev_to_drm(adev)))
+               goto out_clear_err;
+
        r = dma_resv_reserve_fences(&bo->base._resv, 1);
        if (r)
-               goto out;
+               goto out_clear_err;
 
        r = amdgpu_fill_buffer(abo, 0, &bo->base._resv, &fence, true);
        if (WARN_ON(r))
-               goto out;
+               goto out_clear_err;
 
-       amdgpu_vram_mgr_set_cleared(bo->resource);
+       amdgpu_vram_mgr_set_clear_state(bo->resource, true);
        dma_resv_add_fence(&bo->base._resv, fence, DMA_RESV_USAGE_KERNEL);
        dma_fence_put(fence);
 
+       dma_resv_unlock(&bo->base._resv);
+
+       return;
+
+out_clear_err:
+       amdgpu_vram_mgr_set_clear_state(bo->resource, false);
 out:
        dma_resv_unlock(&bo->base._resv);
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 9c5df35f05b7..9ec14ab900f4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -407,9 +407,10 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
                r = amdgpu_fill_buffer(abo, 0, NULL, &wipe_fence,
                                       false);
                if (r) {
+                       amdgpu_vram_mgr_set_clear_state(bo->resource, false);
                        goto error;
                } else if (wipe_fence) {
-                       amdgpu_vram_mgr_set_cleared(bo->resource);
+                       amdgpu_vram_mgr_set_clear_state(bo->resource, true);
                        dma_fence_put(fence);
                        fence = wipe_fence;
                }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h
index b256cbc2bc27..1019c5806ec7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h
@@ -64,9 +64,12 @@ to_amdgpu_vram_mgr_resource(struct ttm_resource *res)
        return container_of(res, struct amdgpu_vram_mgr_resource, base);
 }
 
-static inline void amdgpu_vram_mgr_set_cleared(struct ttm_resource *res)
+static inline void amdgpu_vram_mgr_set_clear_state(struct ttm_resource *res, 
bool is_clear)
 {
-       to_amdgpu_vram_mgr_resource(res)->flags |= DRM_BUDDY_CLEARED;
+       if (is_clear)
+               to_amdgpu_vram_mgr_resource(res)->flags |= DRM_BUDDY_CLEARED;
+       else
+               to_amdgpu_vram_mgr_resource(res)->flags &= ~DRM_BUDDY_CLEARED;
 }
 
 #endif
-- 
2.43.0

Reply via email to