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

Reply via email to