RE: [PATCH 2/2] drm/amdgpu: rework the amdgpu_device_gpu_recover() lock sequence
"Liang, Prike" <[email protected]> Mon, 3 Aug 2026 14:14:24 +0000
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <DS7PR12MB6005B0534D29455F2EA2128DFBD52@DS7PR12MB6005.namprd12.prod.outlook.com> |
AMD General
Ping..
Regards,
Prike
> -----Original Message-----
> From: Liang, Prike <[email protected]>
> Sent: Monday, July 27, 2026 9:35 PM
> To: [email protected]
> Cc: Deucher, Alexander <[email protected]>; Koenig, Christian
> <[email protected]>; Liang, Prike <[email protected]>
> Subject: [PATCH 2/2] drm/amdgpu: rework the amdgpu_device_gpu_recover() l=
ock
> sequence
>
> Suspend the KMS/DRM clients before locking the reset domain.
> drm_client_dev_suspend() acquires clientlist_mutex, which must be taken o=
utside
> reset_domain->sem. Acquiring it while holding the reset domain lock inver=
ts the
> ordering established elsewhere (clientlist_mutex -> ... -> reset_domain->=
sem) and
> can deadlock.
>
> Signed-off-by: Prike Liang <[email protected]>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 20 ++++++++++++++++++--
> 1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 472e96ae884e..c670d5cfe3cc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -5371,8 +5371,6 @@ static void amdgpu_device_halt_activities(struct
> amdgpu_device *adev,
> */
> amdgpu_unregister_gpu_instance(tmp_adev);
>
> - drm_client_dev_suspend(adev_to_drm(tmp_adev));
> -
> /* disable ras on ALL IPs */
> if (!need_emergency_restart && !amdgpu_reset_in_dpc(adev))
> amdgpu_ras_suspend(tmp_adev);
> @@ -5535,6 +5533,22 @@ static void amdgpu_device_gpu_resume(struct
> amdgpu_device *adev, }
>
>
> +static void amdgpu_device_recovery_suspend_clients(struct list_head
> +*device_list) {
> + struct amdgpu_device *tmp_adev =3D NULL;
> +
> + list_for_each_entry(tmp_adev, device_list, reset_list)
> + drm_client_dev_suspend(adev_to_drm(tmp_adev));
> +}
> +
> +static void amdgpu_device_recovery_resume_clients(struct list_head
> +*device_list) {
> + struct amdgpu_device *tmp_adev =3D NULL;
> +
> + list_for_each_entry(tmp_adev, device_list, reset_list)
> + drm_client_dev_resume(adev_to_drm(tmp_adev));
> +}
> +
> /**
> * amdgpu_device_gpu_recover - reset the asic and recover scheduler
> *
> @@ -5613,6 +5627,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device
> *adev,
> /* Cannot be called after locking reset domain */
> amdgpu_ras_pre_reset(adev, &device_list);
>
> + amdgpu_device_recovery_suspend_clients(&device_list);
> /* We need to lock reset domain only once both for XGMI and single =
device */
> amdgpu_device_recovery_get_reset_lock(adev, &device_list);
>
> @@ -5649,6 +5664,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device
> *adev,
> amdgpu_device_gpu_resume(adev, &device_list, need_emergency_restart=
);
> reset_unlock:
> amdgpu_device_recovery_put_reset_lock(adev, &device_list);
> + amdgpu_device_recovery_resume_clients(&device_list);
> amdgpu_ras_post_reset(adev, &device_list);
> end_reset:
> if (hive) {
> --
> 2.34.1