If we didn't get the favorite placement because it was full, we should try moving it into the favorite placement once there is space. Signed-off-by: Friedrich Vock <friedrich.vock@xxxxxx> --- drivers/gpu/drm/ttm/ttm_bo.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 6ac939c58a6b8..af8209f3bc894 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -1111,7 +1111,9 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, struct ttm_placement *placement, struct ttm_operation_ctx *ctx) { - int ret; + struct ttm_resource_manager *man; + int favorite_mem_type; + int ret, i; dma_resv_assert_held(bo->base.resv); @@ -1133,6 +1135,30 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, if (ret) return ret; + if (bo->resource) { + /* + * Also mark the buffer as evicted if we ended up in a + * non-favorite busy placement, so the buffer get + * moved into the favorite spot if possible. + */ + for (i = 1; i < placement->num_busy_placement; ++i) { + if (bo->resource->mem_type != + placement->busy_placement[i].mem_type) + continue; + + favorite_mem_type = + placement->busy_placement[0].mem_type; + man = ttm_manager_type(bo->bdev, + favorite_mem_type); + + spin_lock(&bo->bdev->unevict_lock); + list_add_tail(&bo->evicted, &man->evicted); + man->evicted_bytes += bo->base.size; + spin_unlock(&bo->bdev->unevict_lock); + bo->evicted_type = favorite_mem_type; + } + } + /* * We might need to add a TTM. */ -- 2.44.0