]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/ttm: Fix ttm_bo_shrink() infinite LRU walk on backup failure
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Mon, 11 May 2026 16:24:43 +0000 (18:24 +0200)
committerThomas Hellström <thomas.hellstrom@linux.intel.com>
Thu, 14 May 2026 13:32:29 +0000 (15:32 +0200)
Apply the same fix as b2ed01e7ad ("drm/ttm: Fix ttm_bo_swapout()
infinite LRU walk on swapout failure") to the ttm_bo_shrink() path.

Move del_bulk_move from before the backup to after success only,
using ttm_resource_del_bulk_move_unevictable() since the resource
is now unevictable once fully backed up.

Fixes: 70d645deac98 ("drm/ttm: Add helpers for shrinking")
Cc: Christian König <christian.koenig@amd.com>
Cc: Huang Rui <ray.huang@amd.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: dri-devel@lists.freedesktop.org
Cc: stable@vger.kernel.org # v6.15+
Assisted-by: GitHub_Copilot:claude-opus-4.6
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patch.msgid.link/20260511162443.24352-1-thomas.hellstrom@linux.intel.com
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
drivers/gpu/drm/ttm/ttm_bo_util.c

index f83b7d5ec6c6d04fda912bb61267d16baacab397..3e3c201a0222675b05db46a1fe40c92b6f8d7dab 100644 (file)
@@ -1112,19 +1112,14 @@ long ttm_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
        if (lret < 0)
                return lret;
 
-       if (bo->bulk_move) {
-               spin_lock(&bdev->lru_lock);
-               ttm_resource_del_bulk_move(bo->resource, bo);
-               spin_unlock(&bdev->lru_lock);
-       }
-
        lret = ttm_tt_backup(bdev, bo->ttm, (struct ttm_backup_flags)
                             {.purge = flags.purge,
                              .writeback = flags.writeback});
 
-       if (lret <= 0 && bo->bulk_move) {
+       if (lret > 0) {
                spin_lock(&bdev->lru_lock);
-               ttm_resource_add_bulk_move(bo->resource, bo);
+               ttm_resource_del_bulk_move_unevictable(bo->resource, bo);
+               ttm_resource_move_to_lru_tail(bo->resource);
                spin_unlock(&bdev->lru_lock);
        }