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 <[email protected]>
Reviewed-by: Christian König <[email protected]> > --- > 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); > }
