summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2026-05-22 12:22:10 +0300
committerAlex Deucher <alexander.deucher@amd.com>2026-05-28 23:19:40 +0300
commit989bdec8ca04a4f4855981a68ad295dcc257291f (patch)
treebe949b80ca2603f4007aa41f54d29bbeb960070d
parentc9b2ad100b10dabe0bea691001b0808b4f0fcc55 (diff)
downloadlinux-989bdec8ca04a4f4855981a68ad295dcc257291f.tar.xz
drm/amdgpu: fix amdgpu_vm_bo_reset_state_machine
Can't splice the list but need to handle each entry individually. Otherwise we run into issues after a GPU reset. Fixes: 4cdbba5a16aa ("drm/amdgpu: restructure VM state machine v4") Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Jesse Zhang <jesse.zhang@amd.com> Tested-by: Jesse Zhang <jesse.zhang@amd.com> Reviewed-by: Sunil Khatri <sunil.khatri@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 79efefd25a4f..4558a5663c66 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -266,12 +266,23 @@ static void amdgpu_vm_bo_idle(struct amdgpu_vm_bo_base *vm_bo)
*/
static void amdgpu_vm_bo_reset_state_machine(struct amdgpu_vm *vm)
{
+ struct amdgpu_vm_bo_base *vm_bo, *tmp;
+
+ /*
+ * Don't use list splice here, we need the special handling for the root
+ * PD and set the moved flag appropriately.
+ */
amdgpu_vm_assert_locked(vm);
- list_splice_init(&vm->kernel.idle, &vm->kernel.moved);
- list_splice_init(&vm->always_valid.idle, &vm->always_valid.moved);
+ list_for_each_entry_safe(vm_bo, tmp, &vm->kernel.idle, vm_status)
+ amdgpu_vm_bo_moved(vm_bo);
+ list_for_each_entry_safe(vm_bo, tmp, &vm->always_valid.idle, vm_status)
+ amdgpu_vm_bo_moved(vm_bo);
spin_lock(&vm->individual_lock);
- list_splice_init(&vm->individual.idle, &vm->individual.moved);
+ list_for_each_entry_safe(vm_bo, tmp, &vm->individual.idle, vm_status) {
+ vm_bo->moved = true;
+ list_move(&vm_bo->vm_status, &vm->individual.moved);
+ }
spin_unlock(&vm->individual_lock);
}