* [PATCH v2] drm/amdgpu/userq: lock and validate wptr BOs before reading their GPU offset on restore
@ 2026-08-19 2:21 Jesse Zhang
2026-08-19 18:46 ` Alex Deucher
0 siblings, 1 reply; 2+ messages in thread
From: Jesse Zhang @ 2026-08-19 2:21 UTC (permalink / raw)
To: amd-gfx
Cc: Alexander.Deucher, Christian Koenig, prike.liang, Sunil Khatri,
Jesse Zhang
On resume, amdgpu_userq_vm_validate_and_restore_queue() updates each queue's
wptr GPU address via amdgpu_bo_gpu_offset().
WPTR BOs are VM-mapped, but each BO has its own reservation object and is not
implicitly covered by the VM validation path here. This can leave offset reads
without proper BO locking/placement state and trigger WARN_ONs.
------------[ cut here ]------------
WARNING: amdgpu_object.c:1486 at amdgpu_bo_gpu_offset+0x75/0xa0 [amdgpu], CPU#3: kworker/3:1/116
Workqueue: events amdgpu_userq_restore_worker [amdgpu]
RIP: 0010:amdgpu_bo_gpu_offset+0x75/0xa0 [amdgpu]
Call Trace:
<TASK>
amdgpu_userq_vm_validate_and_restore_queue+0x629/0x960 [amdgpu]
amdgpu_userq_restore_worker+0xa6/0x180 [amdgpu]
process_scheduled_works+0xa6/0x460
worker_thread+0x13c/0x290
kthread+0xfb/0x140
ret_from_fork+0x1b6/0x2b0
ret_from_fork_asm+0x1a/0x30
</TASK>
---[ end trace 0000000000000000 ]---
------------[ cut here ]------------
WARNING: amdgpu_object.c:1485 at amdgpu_bo_gpu_offset+0x9a/0xa0 [amdgpu], CPU#2: kworker/2:1/127
Workqueue: events amdgpu_userq_restore_worker [amdgpu]
RIP: 0010:amdgpu_bo_gpu_offset+0x9a/0xa0 [amdgpu]
Add each queue's WPTR BO to the drm_exec ww context and validate it to its
allowed placement before the later offset update.
v2:
- Clarify that WPTR BOs are VM-mapped (fix incorrect "not part of VM" wording). (Christian)
- Describe both parts of the fix: lock BO reservations in drm_exec and
validate BO placement before offset reads.
Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 24 +++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index 17cc48d87c4d..ab8fc14a235b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -1054,6 +1054,30 @@ amdgpu_userq_vm_validate_and_restore_queue(struct amdgpu_userq_mgr *uq_mgr)
drm_exec_retry_on_contention(&exec);
if (unlikely(ret))
goto unlock_all;
+
+ /*
+ * WPTR BOs are VM-mapped, but each BO has its own reservation
+ * object. Lock them into this drm_exec ww context so the later
+ * amdgpu_bo_gpu_offset() reads are done with the BO resv locked.
+ */
+ xa_for_each(&uq_mgr->userq_xa, tmp_key, queue) {
+ struct ttm_operation_ctx wptr_ctx = { false, false };
+
+ bo = queue->wptr_obj.obj;
+ if (!bo)
+ continue;
+
+ ret = drm_exec_prepare_obj(&exec, &bo->tbo.base,
+ TTM_NUM_MOVE_FENCES + 1);
+ drm_exec_retry_on_contention(&exec);
+ if (unlikely(ret))
+ goto unlock_all;
+
+ amdgpu_bo_placement_from_domain(bo, bo->allowed_domains);
+ ret = ttm_bo_validate(&bo->tbo, &bo->placement, &wptr_ctx);
+ if (unlikely(ret))
+ goto unlock_all;
+ }
}
if (invalidated) {
--
2.49.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2] drm/amdgpu/userq: lock and validate wptr BOs before reading their GPU offset on restore
2026-08-19 2:21 [PATCH v2] drm/amdgpu/userq: lock and validate wptr BOs before reading their GPU offset on restore Jesse Zhang
@ 2026-08-19 18:46 ` Alex Deucher
0 siblings, 0 replies; 2+ messages in thread
From: Alex Deucher @ 2026-08-19 18:46 UTC (permalink / raw)
To: Jesse Zhang
Cc: amd-gfx, Alexander.Deucher, Christian Koenig, prike.liang,
Sunil Khatri
On Tue, Aug 18, 2026 at 10:40 PM Jesse Zhang <Jesse.Zhang@amd.com> wrote:
>
> On resume, amdgpu_userq_vm_validate_and_restore_queue() updates each queue's
> wptr GPU address via amdgpu_bo_gpu_offset().
>
> WPTR BOs are VM-mapped, but each BO has its own reservation object and is not
> implicitly covered by the VM validation path here. This can leave offset reads
> without proper BO locking/placement state and trigger WARN_ONs.
> ------------[ cut here ]------------
> WARNING: amdgpu_object.c:1486 at amdgpu_bo_gpu_offset+0x75/0xa0 [amdgpu], CPU#3: kworker/3:1/116
> Workqueue: events amdgpu_userq_restore_worker [amdgpu]
> RIP: 0010:amdgpu_bo_gpu_offset+0x75/0xa0 [amdgpu]
> Call Trace:
> <TASK>
> amdgpu_userq_vm_validate_and_restore_queue+0x629/0x960 [amdgpu]
> amdgpu_userq_restore_worker+0xa6/0x180 [amdgpu]
> process_scheduled_works+0xa6/0x460
> worker_thread+0x13c/0x290
> kthread+0xfb/0x140
> ret_from_fork+0x1b6/0x2b0
> ret_from_fork_asm+0x1a/0x30
> </TASK>
> ---[ end trace 0000000000000000 ]---
> ------------[ cut here ]------------
> WARNING: amdgpu_object.c:1485 at amdgpu_bo_gpu_offset+0x9a/0xa0 [amdgpu], CPU#2: kworker/2:1/127
> Workqueue: events amdgpu_userq_restore_worker [amdgpu]
> RIP: 0010:amdgpu_bo_gpu_offset+0x9a/0xa0 [amdgpu]
>
> Add each queue's WPTR BO to the drm_exec ww context and validate it to its
> allowed placement before the later offset update.
>
> v2:
> - Clarify that WPTR BOs are VM-mapped (fix incorrect "not part of VM" wording). (Christian)
> - Describe both parts of the fix: lock BO reservations in drm_exec and
> validate BO placement before offset reads.
>
> Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 24 +++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> index 17cc48d87c4d..ab8fc14a235b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> @@ -1054,6 +1054,30 @@ amdgpu_userq_vm_validate_and_restore_queue(struct amdgpu_userq_mgr *uq_mgr)
> drm_exec_retry_on_contention(&exec);
> if (unlikely(ret))
> goto unlock_all;
> +
> + /*
> + * WPTR BOs are VM-mapped, but each BO has its own reservation
> + * object. Lock them into this drm_exec ww context so the later
> + * amdgpu_bo_gpu_offset() reads are done with the BO resv locked.
> + */
> + xa_for_each(&uq_mgr->userq_xa, tmp_key, queue) {
> + struct ttm_operation_ctx wptr_ctx = { false, false };
> +
> + bo = queue->wptr_obj.obj;
> + if (!bo)
> + continue;
> +
> + ret = drm_exec_prepare_obj(&exec, &bo->tbo.base,
> + TTM_NUM_MOVE_FENCES + 1);
> + drm_exec_retry_on_contention(&exec);
> + if (unlikely(ret))
> + goto unlock_all;
> +
> + amdgpu_bo_placement_from_domain(bo, bo->allowed_domains);
> + ret = ttm_bo_validate(&bo->tbo, &bo->placement, &wptr_ctx);
> + if (unlikely(ret))
> + goto unlock_all;
> + }
> }
>
> if (invalidated) {
> --
> 2.49.0
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-08-19 18:46 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-19 2:21 [PATCH v2] drm/amdgpu/userq: lock and validate wptr BOs before reading their GPU offset on restore Jesse Zhang
2026-08-19 18:46 ` Alex Deucher
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.