]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Only set bo->moved when the BO was actually moved
authorNatalie Vock <natalie.vock@gmx.de>
Fri, 29 May 2026 15:30:50 +0000 (17:30 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 1 Jul 2026 17:00:44 +0000 (13:00 -0400)
The "moved" VM state is a bit unfortunately named, because BOs can end
up in this state without being physically moved. While we need to
invalidate every mapping when BOs are physically moved, in some other
cases like PRT binds/unbinds there is no need to refresh mappings except
those affected by the bind.

Full invalidation of all BO mappings manifested as severe regressions in
PRT bind performance, which this patch fixes. The offending patch is
4cdbba5a16aa ("drm/amdgpu: restructure VM state machine v4") in the
amd-staging-drm-next tree, although it has not yet propagated anywhere
else.

Fixes: 4cdbba5a16aa ("drm/amdgpu: restructure VM state machine v4")
Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5437
Signed-off-by: Natalie Vock <natalie.vock@gmx.de>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 0b2fa33b4235991a100dd799c891cf5c242aaed1)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index fee4c94c25858e0ed1838cc78797d2a2b86e8a1a..3f3369d427a1584af1d4d9aea436fd5edff2b137 100644 (file)
@@ -232,7 +232,6 @@ static void amdgpu_vm_bo_moved(struct amdgpu_vm_bo_base *vm_bo)
                vm_bo->moved = false;
                list_move(&vm_bo->vm_status, &lists->idle);
        } else {
-               vm_bo->moved = true;
                list_move(&vm_bo->vm_status, &lists->moved);
        }
        amdgpu_vm_bo_unlock_lists(vm_bo);
@@ -608,6 +607,7 @@ int amdgpu_vm_validate(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                        return r;
 
                vm->update_funcs->map_table(to_amdgpu_bo_vm(bo_base->bo));
+               bo_base->moved = true;
                amdgpu_vm_bo_moved(bo_base);
        }
 
@@ -625,6 +625,7 @@ int amdgpu_vm_validate(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                if (r)
                        return r;
 
+               bo_base->moved = true;
                amdgpu_vm_bo_moved(bo_base);
        }
 
@@ -645,6 +646,7 @@ restart:
                if (r)
                        return r;
 
+               bo_base->moved = true;
                amdgpu_vm_bo_moved(bo_base);
 
                /* It's a bit inefficient to always jump back to the start, but
@@ -2284,6 +2286,7 @@ void amdgpu_vm_bo_invalidate(struct amdgpu_bo *bo, bool evicted)
 
                if (bo_base->moved)
                        continue;
+               bo_base->moved = true;
                amdgpu_vm_bo_moved(bo_base);
        }
 }