Re: [PATCH 1/3] drm/amdgpu/gfx: fix ref counting for ring based profile handling

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

 



On Wed, Mar 12, 2025 at 12:55 AM Feng, Kenneth <Kenneth.Feng@xxxxxxx> wrote:
>
> [AMD Official Use Only - AMD Internal Distribution Only]
>
> Hi Alex,
> I tested this patch. After the desktop is launched, at a certain time, the workload is set to 3d fullscreen twice, then
> The idle worker can't set it back to bootup default.
> Is it expected?

Not expected.  It was looking correct in my testing, but I think I
have a better solution.

Alex

> Thanks.
>
>
> -----Original Message-----
> From: Deucher, Alexander <Alexander.Deucher@xxxxxxx>
> Sent: Tuesday, March 11, 2025 10:17 PM
> To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
> Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Wang, Yang(Kevin) <KevinYang.Wang@xxxxxxx>; Feng, Kenneth <Kenneth.Feng@xxxxxxx>
> Subject: [PATCH 1/3] drm/amdgpu/gfx: fix ref counting for ring based profile handling
>
> Only increment the power profile on the first submission.
> Since the decrement may end up being pushed out as new submissions come in, we only need to increment it once.
>
> Fixes: 1443dd3c67f6 ("drm/amd/pm: fix and simplify workload handling”)
> Cc: Yang Wang <kevinyang.wang@xxxxxxx>
> Cc: Kenneth Feng <kenneth.feng@xxxxxxx>
> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 28 ++++++++++++++++++-------
>  1 file changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> index 984e6ff6e4632..90396aa8ec9f6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> @@ -2142,12 +2142,25 @@ void amdgpu_gfx_enforce_isolation_ring_end_use(struct amdgpu_ring *ring)
>                 amdgpu_gfx_kfd_sch_ctrl(adev, idx, true);  }
>
> +static unsigned int
> +amdgpu_gfx_get_kernel_ring_fence_counts(struct amdgpu_device *adev) {
> +       unsigned int i, fences = 0;
> +
> +       for (i = 0; i < AMDGPU_MAX_GFX_RINGS; ++i)
> +               fences += amdgpu_fence_count_emitted(&adev->gfx.gfx_ring[i]);
> +       for (i = 0; i < (AMDGPU_MAX_COMPUTE_RINGS * AMDGPU_MAX_GC_INSTANCES); ++i)
> +               fences += amdgpu_fence_count_emitted(&adev->gfx.compute_ring[i]);
> +
> +       return fences;
> +}
> +
>  void amdgpu_gfx_profile_idle_work_handler(struct work_struct *work)  {
>         struct amdgpu_device *adev =
>                 container_of(work, struct amdgpu_device, gfx.idle_work.work);
>         enum PP_SMC_POWER_PROFILE profile;
> -       u32 i, fences = 0;
> +       unsigned int fences = 0;
>         int r;
>
>         if (adev->gfx.num_gfx_rings)
> @@ -2155,10 +2168,8 @@ void amdgpu_gfx_profile_idle_work_handler(struct work_struct *work)
>         else
>                 profile = PP_SMC_POWER_PROFILE_COMPUTE;
>
> -       for (i = 0; i < AMDGPU_MAX_GFX_RINGS; ++i)
> -               fences += amdgpu_fence_count_emitted(&adev->gfx.gfx_ring[i]);
> -       for (i = 0; i < (AMDGPU_MAX_COMPUTE_RINGS * AMDGPU_MAX_GC_INSTANCES); ++i)
> -               fences += amdgpu_fence_count_emitted(&adev->gfx.compute_ring[i]);
> +       fences = amdgpu_gfx_get_kernel_ring_fence_counts(adev);
> +
>         if (!fences && !atomic_read(&adev->gfx.total_submission_cnt)) {
>                 r = amdgpu_dpm_switch_power_profile(adev, profile, false);
>                 if (r)
> @@ -2174,6 +2185,7 @@ void amdgpu_gfx_profile_ring_begin_use(struct amdgpu_ring *ring)  {
>         struct amdgpu_device *adev = ring->adev;
>         enum PP_SMC_POWER_PROFILE profile;
> +       unsigned int fences = 0;
>         int r;
>
>         if (adev->gfx.num_gfx_rings)
> @@ -2181,15 +2193,17 @@ void amdgpu_gfx_profile_ring_begin_use(struct amdgpu_ring *ring)
>         else
>                 profile = PP_SMC_POWER_PROFILE_COMPUTE;
>
> -       atomic_inc(&adev->gfx.total_submission_cnt);
> +       fences = amdgpu_gfx_get_kernel_ring_fence_counts(adev);
>
> -       if (!cancel_delayed_work_sync(&adev->gfx.idle_work)) {
> +       if (!cancel_delayed_work_sync(&adev->gfx.idle_work) && !fences &&
> +           !atomic_read(&adev->gfx.total_submission_cnt)) {
>                 r = amdgpu_dpm_switch_power_profile(adev, profile, true);
>                 if (r)
>                         dev_warn(adev->dev, "(%d) failed to disable %s power profile mode\n", r,
>                                  profile == PP_SMC_POWER_PROFILE_FULLSCREEN3D ?
>                                  "fullscreen 3D" : "compute");
>         }
> +       atomic_inc(&adev->gfx.total_submission_cnt);
>  }
>
>  void amdgpu_gfx_profile_ring_end_use(struct amdgpu_ring *ring)
> --
> 2.48.1
>




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

  Powered by Linux