[PATCH] drm/amdgpu: Fix vce work queue was not cancelled when suspend

Christian König ckoenig.leichtzumerken at gmail.com
Thu Sep 27 12:53:46 UTC 2018


Am 27.09.2018 um 14:48 schrieb Rex Zhu:
> The vce cancel_delayed_work_sync never be called.
> driver call the function in error path.
>
> This caused the A+A suspend hang when runtime pm enebled.
> As we will visit the smu in the idle queue. this will cause
> smu hang because the dgpu has been suspend, and the dgpu also
> will be waked up. As the smu has been hang, so the dgpu resume
> will failed.
>
> Signed-off-by: Rex Zhu <Rex.Zhu at amd.com>

Good catch! Patch is Reviewed-by: Christian König 
<christian.koenig at amd.com>.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 3 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 4 ++--
>   2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> index 0cc5190..5f3f540 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> @@ -258,6 +258,8 @@ int amdgpu_vce_suspend(struct amdgpu_device *adev)
>   {
>   	int i;
>   
> +	cancel_delayed_work_sync(&adev->vce.idle_work);
> +
>   	if (adev->vce.vcpu_bo == NULL)
>   		return 0;
>   
> @@ -268,7 +270,6 @@ int amdgpu_vce_suspend(struct amdgpu_device *adev)
>   	if (i == AMDGPU_MAX_VCE_HANDLES)
>   		return 0;
>   
> -	cancel_delayed_work_sync(&adev->vce.idle_work);
>   	/* TODO: suspending running encoding sessions isn't supported */
>   	return -EINVAL;
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> index a73674f..fb7df63 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> @@ -162,11 +162,11 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)
>   	unsigned size;
>   	void *ptr;
>   
> +	cancel_delayed_work_sync(&adev->vcn.idle_work);
> +
>   	if (adev->vcn.vcpu_bo == NULL)
>   		return 0;
>   
> -	cancel_delayed_work_sync(&adev->vcn.idle_work);
> -
>   	size = amdgpu_bo_size(adev->vcn.vcpu_bo);
>   	ptr = adev->vcn.cpu_addr;
>   



More information about the amd-gfx mailing list