All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Timur Kristóf" <timur.kristof@gmail.com>
To: amd-gfx@lists.freedesktop.org,
	Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: kernel-dev@igalia.com,
	"Tvrtko Ursulin" <tvrtko.ursulin@igalia.com>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Christian König" <christian.koenig@amd.com>
Subject: Re: [PATCH 3/3] drm/amdgpu: Do not fiddle with the idle workers too much
Date: Fri, 26 Jun 2026 19:15:19 +0200	[thread overview]
Message-ID: <7279658.9J7NaK4W3v@timur-max> (raw)
In-Reply-To: <20260626085558.97923-4-tvrtko.ursulin@igalia.com>

On 2026. június 26., péntek 10:55:58 közép-európai nyári idő Tvrtko Ursulin 
wrote:
> Idle workers only need to be canceled or pushed back if we are potentially
> idle. Make the both operations conditional on the pre-increment and post-
> decrement status of the in-flight job counter.
> 

Nice catch!

Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>

> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
> Cc: Alex Deucher <alexander.deucher@amd.com>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Timur Kristóf <timur.kristof@gmail.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c  | 11 +++++------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c |  9 +++++----
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c  | 12 +++++-------
>  drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c    | 12 +++++-------
>  4 files changed, 20 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c index 85372af1216d..623a5339bc47
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> @@ -2460,9 +2460,8 @@ 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);
> -
> -	cancel_delayed_work_sync(&adev->gfx.idle_work);
> +	if (!atomic_fetch_inc(&adev->gfx.total_submission_cnt))
> +		cancel_delayed_work_sync(&adev->gfx.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
> @@ -2490,9 +2489,9 @@ void amdgpu_gfx_profile_ring_end_use(struct
> amdgpu_ring *ring) if (amdgpu_dpm_is_overdrive_enabled(adev))
>  		return;
> 
> -	atomic_dec(&ring->adev->gfx.total_submission_cnt);
> -
> -	schedule_delayed_work(&ring->adev->gfx.idle_work,
> GFX_PROFILE_IDLE_TIMEOUT); +	if
> (atomic_dec_and_test(&ring->adev->gfx.total_submission_cnt))
> +		schedule_delayed_work(&ring->adev->gfx.idle_work,
> +				      GFX_PROFILE_IDLE_TIMEOUT);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c index 63ee6ba6a931..57935c321515
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
> @@ -134,8 +134,8 @@ void amdgpu_jpeg_ring_begin_use(struct amdgpu_ring
> *ring) {
>  	struct amdgpu_device *adev = ring->adev;
> 
> -	atomic_inc(&adev->jpeg.total_submission_cnt);
> -	cancel_delayed_work_sync(&adev->jpeg.idle_work);
> +	if (!atomic_fetch_inc(&adev->jpeg.total_submission_cnt))
> +		cancel_delayed_work_sync(&adev->jpeg.idle_work);
> 
>  	mutex_lock(&adev->jpeg.jpeg_pg_lock);
>  	amdgpu_device_ip_set_powergating_state(adev, 
AMD_IP_BLOCK_TYPE_JPEG,
> @@ -145,8 +145,9 @@ void amdgpu_jpeg_ring_begin_use(struct amdgpu_ring
> *ring)
> 
>  void amdgpu_jpeg_ring_end_use(struct amdgpu_ring *ring)
>  {
> -	atomic_dec(&ring->adev->jpeg.total_submission_cnt);
> -	schedule_delayed_work(&ring->adev->jpeg.idle_work, 
JPEG_IDLE_TIMEOUT);
> +	if (atomic_dec_and_test(&ring->adev->jpeg.total_submission_cnt))
> +		schedule_delayed_work(&ring->adev->jpeg.idle_work,
> +				      JPEG_IDLE_TIMEOUT);
>  }
> 
>  int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index b261aa7c1ba8..8d2abf706dfd
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> @@ -506,9 +506,8 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
> struct amdgpu_device *adev = ring->adev;
>  	struct amdgpu_vcn_inst *vcn_inst = &adev->vcn.inst[ring->me];
> 
> -	atomic_inc(&vcn_inst->total_submission_cnt);
> -
> -	cancel_delayed_work_sync(&vcn_inst->idle_work);
> +	if (!atomic_fetch_inc(&vcn_inst->total_submission_cnt))
> +		cancel_delayed_work_sync(&vcn_inst->idle_work);
> 
>  	mutex_lock(&vcn_inst->vcn_pg_lock);
>  	vcn_inst->set_pg_state(vcn_inst, AMD_PG_STATE_UNGATE);
> @@ -550,10 +549,9 @@ void amdgpu_vcn_ring_end_use(struct amdgpu_ring *ring)
>  	    !adev->vcn.inst[ring->me].using_unified_queue)
>  		atomic_dec(&ring->adev->vcn.inst[ring-
>me].dpg_enc_submission_cnt);
> 
> -	atomic_dec(&ring->adev->vcn.inst[ring->me].total_submission_cnt);
> -
> -	schedule_delayed_work(&ring->adev->vcn.inst[ring->me].idle_work,
> -			      VCN_IDLE_TIMEOUT);
> +	if
> (atomic_dec_and_test(&ring->adev->vcn.inst[ring->me].total_submission_cnt))
> +		schedule_delayed_work(&ring->adev->vcn.inst[ring-
>me].idle_work, +				  
>    VCN_IDLE_TIMEOUT);
>  }
> 
>  int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c index 8b8184fe6764..0d8a3cea63ee
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> @@ -159,9 +159,8 @@ static void vcn_v2_5_ring_begin_use(struct amdgpu_ring
> *ring) struct amdgpu_device *adev = ring->adev;
>  	struct amdgpu_vcn_inst *v = &adev->vcn.inst[ring->me];
> 
> -	atomic_inc(&adev->vcn.inst[0].total_submission_cnt);
> -
> -	cancel_delayed_work_sync(&adev->vcn.inst[0].idle_work);
> +	if (!atomic_fetch_inc(&adev->vcn.inst[0].total_submission_cnt))
> +		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
> @@ -207,10 +206,9 @@ static void vcn_v2_5_ring_end_use(struct amdgpu_ring
> *ring) !adev->vcn.inst[ring->me].using_unified_queue)
>  		atomic_dec(&adev->vcn.inst[ring-
>me].dpg_enc_submission_cnt);
> 
> -	atomic_dec(&adev->vcn.inst[0].total_submission_cnt);
> -
> -	schedule_delayed_work(&adev->vcn.inst[0].idle_work,
> -			      VCN_IDLE_TIMEOUT);
> +	if (atomic_dec_and_test(&adev->vcn.inst[0].total_submission_cnt))
> +		schedule_delayed_work(&adev->vcn.inst[0].idle_work,
> +				      VCN_IDLE_TIMEOUT);
>  }
> 
>  /**





  reply	other threads:[~2026-06-26 17:15 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-26  8:55 [PATCH 0/3] Job submission optimisation Tvrtko Ursulin
2026-06-26  8:55 ` [PATCH 1/3] drm/amdgpu: Remove unused amdgpu_device_ip_is_hw Tvrtko Ursulin
2026-06-26 16:59   ` Timur Kristóf
2026-06-26 19:06     ` Tvrtko Ursulin
2026-06-26  8:55 ` [PATCH 2/3] drm/amdgpu: Save some cycles on the job submission path Tvrtko Ursulin
2026-06-26 17:10   ` Timur Kristóf
2026-06-26  8:55 ` [PATCH 3/3] drm/amdgpu: Do not fiddle with the idle workers too much Tvrtko Ursulin
2026-06-26 17:15   ` Timur Kristóf [this message]
2026-06-26 18:59     ` Tvrtko Ursulin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7279658.9J7NaK4W3v@timur-max \
    --to=timur.kristof@gmail.com \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=kernel-dev@igalia.com \
    --cc=tvrtko.ursulin@igalia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.