<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<p style="font-family:Calibri;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - AMD Internal Distribution Only]<br>
</p>
<br>
<div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
Thanks Christian and Teddy for reviewing.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
You are right, it is not good to get reset domain lock earlier.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
The root cause is host driver did not waiting for guest response of FLR. It should be an expected behaviour.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
We will change our DTP. So please ignore this patch.</div>
<div id="Signature" class="elementToProof">
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
<br>
</div>
<p class="elementToProof" style="margin: 0in; font-family: Calibri, sans-serif; font-size: 11pt;">
Thanks.</p>
<p class="elementToProof" style="margin: 0in; font-family: Calibri, sans-serif; font-size: 11pt;">
 </p>
<p class="elementToProof" style="margin: 0in; font-family: Calibri, sans-serif; font-size: 11pt;">
Best regard,</p>
<p class="elementToProof" style="margin: 0in; font-family: Calibri, sans-serif; font-size: 11pt;">
Yifan Zha</p>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Koenig, Christian <Christian.Koenig@amd.com><br>
<b>Sent:</b> Wednesday, June 4, 2025 7:45 PM<br>
<b>To:</b> Zha, YiFan(Even) <Yifan.Zha@amd.com>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>; andrey.grodzovsky@amd.com <andrey.grodzovsky@amd.com>; Deucher, Alexander <Alexander.Deucher@amd.com><br>
<b>Cc:</b> Chen, Horace <Horace.Chen@amd.com>; Deng, Emily <Emily.Deng@amd.com>; Li, Yunxiang (Teddy) <Yunxiang.Li@amd.com>; Yin, ZhenGuo (Chris) <ZhenGuo.Yin@amd.com><br>
<b>Subject:</b> Re: [PATCH] drm/amdgpu: Lock reset domain when VF get host FLR work message</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText"><br>
<br>
On 6/4/25 09:47, Yifan Zha wrote:<br>
> [Why]<br>
> When host detected FLR earlier than guest, it will do HW reset.<br>
> Under multi process scenario, MES could use hardware resource and failed,<br>
> if host complete FLR work.<br>
> <br>
> [How]<br>
> - Lock reset domain in *mailbox_flr_work<br>
> - Use AMDGPU_HOST_FLR flag checking in gpu recover to aviod double locking<br>
> - Clear AMDGPU_HOST_FLR bit after recovery completes<br>
> <br>
> Signed-off-by: Yifan Zha <Yifan.Zha@amd.com><br>
> ---<br>
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 7 ++++---<br>
>  drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c      | 4 ++++<br>
>  drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c      | 4 ++++<br>
>  drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c      | 4 ++++<br>
>  4 files changed, 16 insertions(+), 3 deletions(-)<br>
> <br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
> index e64969d576a6..d59053a2a7e7 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
> @@ -5413,7 +5413,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,<br>
>                if (!amdgpu_ras_get_fed_status(adev))<br>
>                        amdgpu_virt_ready_to_reset(adev);<br>
>                amdgpu_virt_wait_reset(adev);<br>
> -             clear_bit(AMDGPU_HOST_FLR, &reset_context->flags);<br>
>                r = amdgpu_virt_request_full_gpu(adev, true);<br>
>        } else {<br>
>                r = amdgpu_virt_reset_gpu(adev);<br>
> @@ -6098,7 +6097,8 @@ static int amdgpu_device_gpu_recover(struct amdgpu_device *adev,<br>
>        /* We need to lock reset domain only once both for XGMI and single device */<br>
>        tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,<br>
>                                    reset_list);<br>
> -     amdgpu_device_lock_reset_domain(tmp_adev->reset_domain);<br>
> +     if (!test_bit(AMDGPU_HOST_FLR, &reset_context->flags))<br>
> +             amdgpu_device_lock_reset_domain(tmp_adev->reset_domain);<br>
<br>
Clear NAK to that.<br>
<br>
As far as I can see the health check and other operations are intentional outside of the lock.<br>
<br>
Regards,<br>
Christian.<br>
<br>
<br>
>  <br>
>        /* block all schedulers and reset given job's ring */<br>
>        list_for_each_entry(tmp_adev, device_list_handle, reset_list) {<br>
> @@ -6293,7 +6293,8 @@ static void amdgpu_device_gpu_resume(struct amdgpu_device *adev,<br>
>  <br>
>        tmp_adev = list_first_entry(device_list, struct amdgpu_device,<br>
>                                            reset_list);<br>
> -     amdgpu_device_unlock_reset_domain(tmp_adev->reset_domain);<br>
> +     if (!test_bit(AMDGPU_HOST_FLR, &reset_context->flags))<br>
> +             amdgpu_device_unlock_reset_domain(tmp_adev->reset_domain);<br>
>  <br>
>  }<br>
>  <br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c<br>
> index 48101a34e049..f16449fbbc5c 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c<br>
> @@ -287,8 +287,12 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)<br>
>                reset_context.reset_req_dev = adev;<br>
>                clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);<br>
>                set_bit(AMDGPU_HOST_FLR, &reset_context.flags);<br>
> +             amdgpu_device_lock_reset_domain(adev->reset_domain);<br>
>  <br>
>                amdgpu_device_gpu_recover(adev, NULL, &reset_context);<br>
> +<br>
> +             amdgpu_device_unlock_reset_domain(adev->reset_domain);<br>
> +             clear_bit(AMDGPU_HOST_FLR, &reset_context.flags);<br>
>        }<br>
>  }<br>
>  <br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c<br>
> index f6d8597452ed..15e6e7cdd1da 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c<br>
> @@ -354,8 +354,12 @@ static void xgpu_nv_mailbox_flr_work(struct work_struct *work)<br>
>                reset_context.reset_req_dev = adev;<br>
>                clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);<br>
>                set_bit(AMDGPU_HOST_FLR, &reset_context.flags);<br>
> +             amdgpu_device_lock_reset_domain(adev->reset_domain);<br>
>  <br>
>                amdgpu_device_gpu_recover(adev, NULL, &reset_context);<br>
> +<br>
> +             amdgpu_device_unlock_reset_domain(adev->reset_domain);<br>
> +             clear_bit(AMDGPU_HOST_FLR, &reset_context.flags);<br>
>        }<br>
>  }<br>
>  <br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c<br>
> index e1d63bed84bf..c1b32081e7ab 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c<br>
> @@ -524,8 +524,12 @@ static void xgpu_vi_mailbox_flr_work(struct work_struct *work)<br>
>                reset_context.reset_req_dev = adev;<br>
>                clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);<br>
>                set_bit(AMDGPU_HOST_FLR, &reset_context.flags);<br>
> +             amdgpu_device_lock_reset_domain(adev->reset_domain);<br>
>  <br>
>                amdgpu_device_gpu_recover(adev, NULL, &reset_context);<br>
> +<br>
> +             amdgpu_device_unlock_reset_domain(adev->reset_domain);<br>
> +             clear_bit(AMDGPU_HOST_FLR, &reset_context.flags);<br>
>        }<br>
>  }<br>
>  <br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>