From: Jesse Zhang <Jesse.Zhang@amd.com>
To: <amd-gfx@lists.freedesktop.org>
Cc: <Alexander.Deucher@amd.com>,
Christian Koenig <christian.koenig@amd.com>,
Jesse Zhang <Jesse.Zhang@amd.com>
Subject: [PATCH 4/4] drm/amdgpu/userq: reset a hung SDMA user queue over MMIO
Date: Thu, 3 Sep 2026 17:42:06 +0800 [thread overview]
Message-ID: <20260903094438.3880682-4-Jesse.Zhang@amd.com> (raw)
In-Reply-To: <20260903094438.3880682-1-Jesse.Zhang@amd.com>
A hung SDMA user queue wedges MES, so the MES packet reset times out and
falls back to a full MODE1 reset - once per in-flight job, a reset storm.
The queue is still on its HW slot at the first hang-detect, so use
detect_hung_queue to recover its slot from the doorbell and reset it over
MMIO, which does not need MES. Mark it HUNG (not UNMAPPED) so the restore
worker does not re-map and re-run the guilty job, and short-circuit the
per-fence hang-detect re-entry once the queue is already reset.
Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
---
drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 48 ++++++++++++++++++----
1 file changed, 39 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
index 46ebc002548d..2ce94cd04fd5 100644
--- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
+++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
@@ -213,26 +213,56 @@ int mes_userq_reset(struct amdgpu_usermode_queue *queue)
struct mes_reset_queue_input queue_input;
int r;
- /* XXX: add a FW version check for SDMA per queue reset */
+ /* already reset by an earlier job's hang-detect; just signal and bail */
+ if (queue->state == AMDGPU_USERQ_STATE_HUNG) {
+ amdgpu_userq_fence_driver_force_completion(queue);
+ return 0;
+ }
+
memset(&queue_input, 0x0, sizeof(struct mes_reset_queue_input));
queue_input.doorbell_offset = queue->doorbell_index;
queue_input.queue_type = queue->queue_type;
+ /*
+ * The MES packet reset fails once the hung queue wedges MES. For SDMA the
+ * queue is still on its HW slot, so reset it over MMIO instead: recover
+ * the (instance, queue_id) slot from the doorbell.
+ */
+ if (queue->queue_type == AMDGPU_HW_IP_DMA &&
+ adev->sdma.instance[0].funcs &&
+ adev->sdma.instance[0].funcs->detect_hung_queue) {
+ u32 instance, hw_queue_id;
+
+ if (adev->sdma.instance[0].funcs->detect_hung_queue(adev,
+ queue->doorbell_index, &instance, &hw_queue_id)) {
+ queue_input.use_mmio = true;
+ queue_input.me_id = instance;
+ queue_input.queue_id = hw_queue_id;
+ } else {
+ dev_warn(adev->dev,
+ "SDMA userq (doorbell %llu) not on any HW slot; falling back to MES reset\n",
+ queue->doorbell_index);
+ }
+ }
+
+ /* HUNG, not UNMAPPED: the guilty job is still in the ring, so the
+ * restore worker must not re-map and re-run it.
+ */
+ queue->state = AMDGPU_USERQ_STATE_HUNG;
+
amdgpu_mes_lock(&adev->mes);
r = adev->mes.funcs->reset_hw_queue(&adev->mes, &queue_input);
amdgpu_mes_unlock(&adev->mes);
if (r)
return r;
- /* mes_userq_unmap() does not update queue->state; mark it UNMAPPED so the
- * destroy path does not issue a second REMOVE_QUEUE for the removed queue.
- */
+ /* drop the queue from MES and force-complete its fences */
r = mes_userq_unmap(queue);
- if (!r) {
- trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_UNMAPPED);
- queue->state = AMDGPU_USERQ_STATE_UNMAPPED;
- }
- return r;
+ if (r)
+ return r;
+
+ amdgpu_userq_fence_driver_force_completion(queue);
+ return 0;
}
int mes_userq_reset_queue(struct amdgpu_device *adev,
--
2.49.0
next prev parent reply other threads:[~2026-09-03 9:44 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 9:42 [PATCH 1/4] drm/amdgpu/sdma: add detect_hung_queue callback Jesse Zhang
2026-09-03 9:42 ` [PATCH 2/4] drm/amdgpu/sdma6: implement detect_hung_queue Jesse Zhang
2026-09-03 9:42 ` [PATCH 3/4] drm/amdgpu/sdma7: " Jesse Zhang
2026-09-03 9:42 ` Jesse Zhang [this message]
2026-09-03 18:25 ` [PATCH 4/4] drm/amdgpu/userq: reset a hung SDMA user queue over MMIO Alex Deucher
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260903094438.3880682-4-Jesse.Zhang@amd.com \
--to=jesse.zhang@amd.com \
--cc=Alexander.Deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).