On Wed, Jul 1, 2026 at 6:27 AM Jesse Zhang <[email protected]> wrote: > > Destroying a hung user queue issues a MES REMOVE_QUEUE that times out, > The destroy path only logged the error and freed the queue, so the > next userq submission failed and forced a GPU reset attributed to an innocent > workload. > > Kick the userq reset work when unmap fails so the GPU is recovered at > destroy time. > > Signed-off-by: Jesse Zhang <[email protected]>
Acked-by: Alex Deucher <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > index fb7e18c841ee..aa5cc5642e87 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > @@ -542,6 +542,15 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, > struct amdgpu_usermode_que > amdgpu_userq_cleanup(queue); > mutex_unlock(&uq_mgr->userq_mutex); > > + /* > + * A failed unmap means MES could not remove the hung queue and is now > + * unresponsive. Recover the GPU here so the wedged MES does not fail > + * the next, unrelated queue submission and trigger a reset attributed > + * to an innocent workload. > + */ > + if (r) > + queue_work(adev->reset_domain->wq, &uq_mgr->reset_work); > + > cancel_delayed_work_sync(&queue->hang_detect_work); > uq_funcs->mqd_destroy(queue); > queue->userq_mgr = NULL; > -- > 2.49.0 >
