[PATCH 06/28] drm/amdgpu: move force completion into ring resets
Christian König
christian.koenig at amd.com
Mon Jun 2 14:22:17 UTC 2025
On 5/29/25 22:07, Alex Deucher wrote:
> Move the force completion handling into each ring
> reset function so that each engine can determine
> whether or not it needs to force completion on the
> jobs in the ring.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 6 +-----
> drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c | 1 +
> drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c | 1 +
> drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c | 1 +
> drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c | 1 +
> drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 1 +
> drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c | 1 +
> drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 4 ++++
> drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 5 ++++-
> drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 5 ++++-
> drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c | 1 +
> drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c | 1 +
> drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 1 +
> drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 5 ++---
> drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 1 +
> drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c | 1 +
> 16 files changed, 26 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> index 0b9086a747c0a..a0fab947143b5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> @@ -159,12 +159,8 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
>
> r = amdgpu_ring_reset(ring, job->vmid);
> if (!r) {
> - if (is_guilty) {
> + if (is_guilty)
> atomic_inc(&ring->adev->gpu_reset_counter);
> - if ((ring->funcs->type != AMDGPU_RING_TYPE_GFX) &&
> - (ring->funcs->type != AMDGPU_RING_TYPE_COMPUTE))
> - amdgpu_fence_driver_force_completion(ring);
> - }
> drm_sched_wqueue_start(&ring->sched);
> dev_err(adev->dev, "Ring %s reset succeeded\n",
> ring->sched.name);
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> index 4cde8a8bcc837..336ca44950dfa 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> @@ -768,6 +768,7 @@ static int jpeg_v2_0_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
> {
> jpeg_v2_0_stop(ring->adev);
> jpeg_v2_0_start(ring->adev);
> + amdgpu_fence_driver_force_completion(ring);
> return amdgpu_ring_test_helper(ring);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> index 8b39e114f3be1..72d739e38a8ae 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> @@ -647,6 +647,7 @@ static int jpeg_v2_5_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
> {
> jpeg_v2_5_stop_inst(ring->adev, ring->me);
> jpeg_v2_5_start_inst(ring->adev, ring->me);
> + amdgpu_fence_driver_force_completion(ring);
> return amdgpu_ring_test_helper(ring);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> index 2f8510c2986b9..7974d04c15e92 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> @@ -559,6 +559,7 @@ static int jpeg_v3_0_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
> {
> jpeg_v3_0_stop(ring->adev);
> jpeg_v3_0_start(ring->adev);
> + amdgpu_fence_driver_force_completion(ring);
> return amdgpu_ring_test_helper(ring);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> index f17ec5414fd69..9301d0ff2593b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> @@ -727,6 +727,7 @@ static int jpeg_v4_0_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
>
> jpeg_v4_0_stop(ring->adev);
> jpeg_v4_0_start(ring->adev);
> + amdgpu_fence_driver_force_completion(ring);
> return amdgpu_ring_test_helper(ring);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
> index 79e342d5ab28d..ef5075e111300 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
> @@ -1150,6 +1150,7 @@ static int jpeg_v4_0_3_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
>
> jpeg_v4_0_3_core_stall_reset(ring);
> jpeg_v4_0_3_start_jrbc(ring);
> + amdgpu_fence_driver_force_completion(ring);
> return amdgpu_ring_test_helper(ring);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
> index 3b6f65a256464..858b930d1dd54 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
> @@ -841,6 +841,7 @@ static int jpeg_v5_0_1_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
>
> jpeg_v5_0_1_core_stall_reset(ring);
> jpeg_v5_0_1_init_jrbc(ring);
> + amdgpu_fence_driver_force_completion(ring);
> return amdgpu_ring_test_helper(ring);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> index 9c169112a5e7b..eb78bf04a490b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> @@ -1670,6 +1670,7 @@ static bool sdma_v4_4_2_page_ring_is_guilty(struct amdgpu_ring *ring)
> static int sdma_v4_4_2_reset_queue(struct amdgpu_ring *ring, unsigned int vmid)
> {
> struct amdgpu_device *adev = ring->adev;
> + bool is_guilty = ring->funcs->is_guilty(ring);
> u32 id = GET_INST(SDMA0, ring->me);
> int r;
>
> @@ -1680,6 +1681,9 @@ static int sdma_v4_4_2_reset_queue(struct amdgpu_ring *ring, unsigned int vmid)
> r = amdgpu_sdma_reset_engine(adev, id);
> amdgpu_amdkfd_resume(adev, false);
>
> + if (is_guilty)
> + amdgpu_fence_driver_force_completion(ring);
> +
> return r;
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> index 9505ae96fbecc..43885dc04b632 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> @@ -1542,8 +1542,11 @@ static int sdma_v5_0_reset_queue(struct amdgpu_ring *ring, unsigned int vmid)
> {
> struct amdgpu_device *adev = ring->adev;
> u32 inst_id = ring->me;
> + int r;
>
> - return amdgpu_sdma_reset_engine(adev, inst_id);
> + r = amdgpu_sdma_reset_engine(adev, inst_id);
> + amdgpu_fence_driver_force_completion(ring);
> + return r;
> }
>
> static int sdma_v5_0_stop_queue(struct amdgpu_ring *ring)
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> index a6e612b4a8928..ee94e457ee25d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> @@ -1455,8 +1455,11 @@ static int sdma_v5_2_reset_queue(struct amdgpu_ring *ring, unsigned int vmid)
> {
> struct amdgpu_device *adev = ring->adev;
> u32 inst_id = ring->me;
> + int r;
>
> - return amdgpu_sdma_reset_engine(adev, inst_id);
> + r = amdgpu_sdma_reset_engine(adev, inst_id);
> + amdgpu_fence_driver_force_completion(ring);
> + return r;
> }
>
> static int sdma_v5_2_stop_queue(struct amdgpu_ring *ring)
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> index 5a70ae17be04e..86ef0e30a89e8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> @@ -1559,6 +1559,7 @@ static int sdma_v6_0_reset_queue(struct amdgpu_ring *ring, unsigned int vmid)
> if (r)
> return r;
>
> + amdgpu_fence_driver_force_completion(ring);
> return sdma_v6_0_gfx_resume_instance(adev, i, true);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> index befe013b11a78..c9993424b3923 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> @@ -823,6 +823,7 @@ static int sdma_v7_0_reset_queue(struct amdgpu_ring *ring, unsigned int vmid)
> if (r)
> return r;
>
> + amdgpu_fence_driver_force_completion(ring);
> return sdma_v7_0_gfx_resume_instance(adev, i, true);
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> index b5071f77f78d2..f1ccc6c7be390 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> @@ -1977,6 +1977,7 @@ static int vcn_v4_0_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
>
> vcn_v4_0_stop(vinst);
> vcn_v4_0_start(vinst);
> + amdgpu_fence_driver_force_completion(ring);
>
> return amdgpu_ring_test_helper(ring);
> }
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> index 5a33140f57235..6ef5944584e56 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> @@ -1620,9 +1620,8 @@ static int vcn_v4_0_3_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
> adev->vcn.caps |= AMDGPU_VCN_CAPS(RRMT_ENABLED);
> vcn_v4_0_3_hw_init_inst(vinst);
> vcn_v4_0_3_start_dpg_mode(vinst, adev->vcn.inst[ring->me].indirect_sram);
> - r = amdgpu_ring_test_helper(ring);
> -
> - return r;
> + amdgpu_fence_driver_force_completion(ring);
> + return amdgpu_ring_test_helper(ring);
> }
>
> static const struct amdgpu_ring_funcs vcn_v4_0_3_unified_ring_vm_funcs = {
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> index 16ade84facc78..1c13ceb3bed8b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> @@ -1475,6 +1475,7 @@ static int vcn_v4_0_5_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
>
> vcn_v4_0_5_stop(vinst);
> vcn_v4_0_5_start(vinst);
> + amdgpu_fence_driver_force_completion(ring);
>
> return amdgpu_ring_test_helper(ring);
> }
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> index f8e3f0b882da5..a998708bc0745 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> @@ -1202,6 +1202,7 @@ static int vcn_v5_0_0_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
>
> vcn_v5_0_0_stop(vinst);
> vcn_v5_0_0_start(vinst);
> + amdgpu_fence_driver_force_completion(ring);
>
> return amdgpu_ring_test_helper(ring);
> }
More information about the amd-gfx
mailing list