Try unevicting only VRAM/GTT BOs.

Signed-off-by: Friedrich Vock <friedrich.v...@gmx.de>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 50 +++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 64f5001a7dc5d..98e8a40408804 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -166,6 +166,31 @@ static void amdgpu_evict_flags(struct ttm_buffer_object 
*bo,
        *placement = abo->placement;
 }

+/**
+ * amdgpu_unevict_flags - Compute placement flags
+ *
+ * @bo: The buffer object to unevict
+ * @dest: Destination for unevicted BO
+ *
+ * Fill in placement data when for restoring evicted BOs
+ */
+static void amdgpu_unevict_flags(struct ttm_buffer_object *bo,
+                                struct ttm_placement *dest)
+{
+       struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
+
+       WARN_ON(bo->evicted_type == AMDGPU_PL_GDS ||
+               bo->evicted_type == AMDGPU_PL_GWS ||
+               bo->evicted_type == AMDGPU_PL_OA ||
+               bo->evicted_type == AMDGPU_PL_DOORBELL);
+       WARN_ON(bo->evicted_type == TTM_NUM_MEM_TYPES);
+
+       amdgpu_bo_placement_from_domain(abo, abo->preferred_domains);
+       *dest = abo->placement;
+       dest->num_placement = 1;
+       dest->num_busy_placement = 1;
+}
+
 /**
  * amdgpu_ttm_map_buffer - Map memory into the GART windows
  * @bo: buffer object to map
@@ -1424,6 +1449,29 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct 
ttm_buffer_object *bo,
        return ttm_bo_eviction_valuable(bo, place);
 }

+/*
+ * amdgpu_ttm_bo_uneviction_valuable - Check to see if we can unevict a
+ * buffer object.
+ *
+ * Return true if uneviction is sensible. Called by ttm_bo_evict to
+ * decide whether to consider the buffer object for uneviction later.
+ */
+static bool amdgpu_ttm_bo_uneviction_valuable(struct ttm_buffer_object *bo)
+{
+       struct amdgpu_bo *abo;
+
+       if (!amdgpu_bo_is_amdgpu_bo(bo))
+               return false;
+
+       abo = ttm_to_amdgpu_bo(bo);
+
+       if (bo->type != ttm_bo_type_device)
+               return false;
+
+       return (abo->preferred_domains &
+               (AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT)) != 0;
+}
+
 static void amdgpu_ttm_vram_mm_access(struct amdgpu_device *adev, loff_t pos,
                                      void *buf, size_t size, bool write)
 {
@@ -1581,6 +1629,8 @@ static struct ttm_device_funcs amdgpu_bo_driver = {
        .ttm_tt_destroy = &amdgpu_ttm_backend_destroy,
        .eviction_valuable = amdgpu_ttm_bo_eviction_valuable,
        .evict_flags = &amdgpu_evict_flags,
+       .uneviction_valuable = &amdgpu_ttm_bo_uneviction_valuable,
+       .unevict_flags = &amdgpu_unevict_flags,
        .move = &amdgpu_bo_move,
        .delete_mem_notify = &amdgpu_bo_delete_mem_notify,
        .release_notify = &amdgpu_bo_release_notify,
--
2.44.0

Reply via email to