diff options
| author | Jesse Zhang <Jesse.Zhang@amd.com> | 2026-10-26 21:03:00 +0800 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2026-11-04 12:21:21 -0500 |
| commit | ce5f2a25bdf6b2bccfc4ffb5e4c5f12e97eeace1 (patch) | |
| tree | ab3cf966f8d2f1d38f1d5d76077cba78ed377790 | |
| parent | 920ca822f527e45ce084b36f3c420b625eb7c62a (diff) | |
drm/amdgpu/userq: validate the moved individual BOs on restore
An individual BO of a user queue VM, i.e. one which doesn't share the
root reservation, goes to the individual needs_update list when it is
evicted. The user queue restore looked at vm->invalidated for them, which
the VM state machine rework turned into the always_valid evicted list and
commit 18decfc9e8cc ("drm/amdgpu/userq: actually validate userq BOs")
into the individual evicted one. That list only holds imported DMA-bufs of
compute VMs though, so for a user queue VM nothing is validated.
The restore then neither locks such a BO nor moves it back. Its PTEs are
updated to wherever it is now, cleared if it went to system memory, and
it doesn't get the new eviction fence, so it can move again under the
running queue.
On navi48, once the BOs of an SDMA user queue are evicted from GTT
(debugfs amdgpu_evict_gtt) the queue faults on its ring and rptr:
amdgpu 0000:03:00.0: in page starting at address 0x0000000100000000 from client 10
amdgpu 0000:03:00.0: Faulty UTCL2 client ID: SDMA0 (0xd)
amdgpu 0000:03:00.0: in page starting at address 0x0000000100101000 from client 10
Validate the BOs on the individual needs_update list like before.
Fixes: 4cdbba5a16aa ("drm/amdgpu: restructure VM state machine v4")
Fixes: 18decfc9e8cc ("drm/amdgpu/userq: actually validate userq BOs")
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit eb0d94765d4be18d41e93ad09947dd9cc06ed31a)
Cc: stable@vger.kernel.org
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c index 958a3c9f4c61..9fc8e9e97595 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c @@ -990,7 +990,11 @@ static int amdgpu_userq_validate_vm(void *param, struct amdgpu_bo *bo) return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); } -/* Handle all BOs on the invalidated list, validate them and update the PTs */ +/* + * Handle all individual BOs which were moved, lock and validate them and + * update the PTs. An evicted individual BO lands on the needs_update list, + * the evicted one only holds imported DMA-bufs of compute VMs. + */ static int amdgpu_userq_bo_validate(struct amdgpu_device *adev, struct drm_exec *exec, struct amdgpu_vm *vm) @@ -1001,8 +1005,8 @@ amdgpu_userq_bo_validate(struct amdgpu_device *adev, struct drm_exec *exec, int ret; spin_lock(&vm->individual_lock); - while (!list_empty(&vm->individual.evicted)) { - bo_va = list_first_entry(&vm->individual.evicted, + while (!list_empty(&vm->individual.needs_update)) { + bo_va = list_first_entry(&vm->individual.needs_update, struct amdgpu_bo_va, base.vm_status); bo = bo_va->base.bo; |
