Re: [PATCH] drm/amdgpu/vcn: adjust workload profile handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 3/17/2025 8:17 PM, Alex Deucher wrote:
> No need to make the workload profile setup dependent
> on the results of cancelling the delayed work thread.
> We have all of the necessary checking in place for the
> workload profile reference counting, so separate the
> two.  As it is now, we can theoretically end up with
> the call from begin_use happening while the worker
> thread is executing which would result in the profile
> not getting set for that submission.  It should not
> affect the reference counting.
> 
> v2: bail early if the the profile is already active (Lijo)
> 
> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx>

Reviewed-by: Lijo Lazar <lijo.lazar@xxxxxxx>

Thanks,
Lijo

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 28 ++++++++++++++++---------
>  drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c   | 28 ++++++++++++++++---------
>  2 files changed, 36 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> index 6b410e601bb65..1991dd3d1056a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> @@ -460,18 +460,26 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
>  
>  	atomic_inc(&vcn_inst->total_submission_cnt);
>  
> -	if (!cancel_delayed_work_sync(&vcn_inst->idle_work)) {
> -		mutex_lock(&adev->vcn.workload_profile_mutex);
> -		if (!adev->vcn.workload_profile_active) {
> -			r = amdgpu_dpm_switch_power_profile(adev, PP_SMC_POWER_PROFILE_VIDEO,
> -							    true);
> -			if (r)
> -				dev_warn(adev->dev, "(%d) failed to switch to video power profile mode\n", r);
> -			adev->vcn.workload_profile_active = true;
> -		}
> -		mutex_unlock(&adev->vcn.workload_profile_mutex);
> +	cancel_delayed_work_sync(&vcn_inst->idle_work);
> +
> +	/* We can safely return early here because we've cancelled the
> +	 * the delayed work so there is no one else to set it to false
> +	 * and we don't care if someone else sets it to true.
> +	 */
> +	if (adev->vcn.workload_profile_active)
> +		goto pg_lock;
> +
> +	mutex_lock(&adev->vcn.workload_profile_mutex);
> +	if (!adev->vcn.workload_profile_active) {
> +		r = amdgpu_dpm_switch_power_profile(adev, PP_SMC_POWER_PROFILE_VIDEO,
> +						    true);
> +		if (r)
> +			dev_warn(adev->dev, "(%d) failed to switch to video power profile mode\n", r);
> +		adev->vcn.workload_profile_active = true;
>  	}
> +	mutex_unlock(&adev->vcn.workload_profile_mutex);
>  
> +pg_lock:
>  	mutex_lock(&vcn_inst->vcn_pg_lock);
>  	vcn_inst->set_pg_state(vcn_inst, AMD_PG_STATE_UNGATE);
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> index b4b8091980ad5..d716510b8dd68 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> @@ -169,18 +169,26 @@ static void vcn_v2_5_ring_begin_use(struct amdgpu_ring *ring)
>  
>  	atomic_inc(&adev->vcn.inst[0].total_submission_cnt);
>  
> -	if (!cancel_delayed_work_sync(&adev->vcn.inst[0].idle_work)) {
> -		mutex_lock(&adev->vcn.workload_profile_mutex);
> -		if (!adev->vcn.workload_profile_active) {
> -			r = amdgpu_dpm_switch_power_profile(adev, PP_SMC_POWER_PROFILE_VIDEO,
> -							    true);
> -			if (r)
> -				dev_warn(adev->dev, "(%d) failed to switch to video power profile mode\n", r);
> -			adev->vcn.workload_profile_active = true;
> -		}
> -		mutex_unlock(&adev->vcn.workload_profile_mutex);
> +	cancel_delayed_work_sync(&adev->vcn.inst[0].idle_work);
> +
> +	/* We can safely return early here because we've cancelled the
> +	 * the delayed work so there is no one else to set it to false
> +	 * and we don't care if someone else sets it to true.
> +	 */
> +	if (adev->vcn.workload_profile_active)
> +		goto pg_lock;
> +
> +	mutex_lock(&adev->vcn.workload_profile_mutex);
> +	if (!adev->vcn.workload_profile_active) {
> +		r = amdgpu_dpm_switch_power_profile(adev, PP_SMC_POWER_PROFILE_VIDEO,
> +						    true);
> +		if (r)
> +			dev_warn(adev->dev, "(%d) failed to switch to video power profile mode\n", r);
> +		adev->vcn.workload_profile_active = true;
>  	}
> +	mutex_unlock(&adev->vcn.workload_profile_mutex);
>  
> +pg_lock:
>  	mutex_lock(&adev->vcn.inst[0].vcn_pg_lock);
>  	amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
>  					       AMD_PG_STATE_UNGATE);




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux