summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmber Lin <amber.lin@amd.com>2026-06-25 23:09:10 -0400
committerAlex Deucher <alexander.deucher@amd.com>2026-07-01 11:41:10 -0400
commit9d5f1c0db1d37db24bb9556dd1e433eb30fbd3b6 (patch)
tree23fe075b8470c6fba434197fac09926a15a514da
parentd4af96bef22de297a7c301bebd6625a7f0152b87 (diff)
downloadlinux-9d5f1c0db1d37db24bb9556dd1e433eb30fbd3b6.tar.gz
linux-9d5f1c0db1d37db24bb9556dd1e433eb30fbd3b6.zip
drm/amdgpu: Fix false error return to non-KCQ
amdgpu_gfx_reset_mes_compute is used to coordinate suspend_all, reset, and resume_all between KCQ and compute user queues. When a hung queue comes from the compute user queues and the reset is successful, the KCQ failure after reset should be sent to KCQ only and not the compute user queues. Compute user queues can operate after a successful reset without a mode reset. Fixes: a4e4d945cba8 ("drm/amdgpu/gfx: defer per-queue helper_end until after MES resume") Signed-off-by: Amber Lin <amber.lin@amd.com> Acked-by: Jesse Zhang <Jesse.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
index 982b41606d48..419992589df3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
@@ -2282,6 +2282,7 @@ int amdgpu_gfx_reset_mes_compute(struct amdgpu_device *adev,
struct mes_remove_queue_input *queue_input = (struct mes_remove_queue_input *)faulty_queue_input;
struct amdgpu_gfx_deferred_entry deferred_end[AMDGPU_MAX_COMPUTE_RINGS + 1];
int n_deferred = 0;
+ int ring_err;
guard(mutex)(&adev->gfx.mec.reset_mutex);
/* stop the drm schedulers for all compute queues */
@@ -2375,17 +2376,23 @@ out:
/* Now CP is running again — replay backed-up commands and ring
* doorbells on each reset queue.
*/
+ ring_err = r;
for (i = 0; i < n_deferred; i++) {
int er = amdgpu_ring_reset_helper_end(deferred_end[i].ring,
deferred_end[i].fence);
- if (er && !r)
- r = er;
+
+ if (er && !ring_err)
+ ring_err = er;
}
- if (!r)
+ if (!ring_err)
amdgpu_gfx_reset_start_compute_scheds(adev, ring);
- return r;
+ /* If this reset is triggered by non-KCQ, the KCQ result after resume must
+ * not override the reset result; otherwise a false reset failure is returned
+ * to the non-KCQ caller
+ */
+ return ring ? ring_err : r;
}
int amdgpu_gfx_cleaner_shader_sw_init(struct amdgpu_device *adev,