AMD General Acked-by: Jesse Zhang <[email protected]>
> -----Original Message----- > From: Lin, Amber <[email protected]> > Sent: Friday, June 26, 2026 11:11 AM > To: [email protected]; Zhang, Jesse(Jie) <[email protected]> > Cc: Lin, Amber <[email protected]> > Subject: [PATCH] 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 computer 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: 2dcf9a5a2352 ("drm/amdgpu/gfx: defer per-queue helper_end until after > MES > resume") > Signed-off-by: Amber Lin <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 15 +++++++++++---- > 1 file 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..52dd26dd82d2 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 @@ int amdgpu_gfx_reset_mes_compute(struct amdgpu_device *adev, > /* 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 > should > + * not override the reset result. It can return a false reset failure > to the > + * non-KCQ caller > + */ > + return ring? ring_err : r; > } > > int amdgpu_gfx_cleaner_shader_sw_init(struct amdgpu_device *adev, > -- > 2.43.0
