summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNatalie Vock <natalie.vock@gmx.de>2026-05-29 17:30:50 +0200
committerAlex Deucher <alexander.deucher@amd.com>2026-07-01 11:51:14 -0400
commit0b2fa33b4235991a100dd799c891cf5c242aaed1 (patch)
tree19e930b00347a674ed259ea99c478752b6795f48
parent33f0bfcf1683527715ae8ed72a31203b963d47cf (diff)
downloadlinux-next-0b2fa33b4235991a100dd799c891cf5c242aaed1.tar.gz
linux-next-0b2fa33b4235991a100dd799c891cf5c242aaed1.zip
drm/amdgpu: Only set bo->moved when the BO was actually moved
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>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index fee4c94c2585..3f3369d427a1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -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);
}
}