[PATCH 06/30] drm/amdgpu: move scheduler wqueue handling into callbacks

Christian König christian.koenig at amd.com
Thu Jun 26 09:33:28 UTC 2025


On 25.06.25 23:06, Alex Deucher wrote:
> Move the scheduler wqueue stopping and starting into
> the ring reset callbacks.  On some IPs we have to reset
> an engine which may have multiple queues.  Move the wqueue
> handling into the backend so we can handle them as needed
> based on the type of reset available.
> 
> 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  |  8 --------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 17 ++++-------------
>  drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c   |  6 ++++++
>  drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c   |  6 ++++++
>  drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c   |  6 ++++++
>  drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c    |  3 +++
>  drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c  |  3 +++
>  drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c   |  2 ++
>  drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c   |  2 ++
>  drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c   |  2 ++
>  drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c   |  2 ++
>  drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c |  2 ++
>  drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c |  2 ++
>  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   |  3 +++
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   |  3 +++
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c    |  2 ++
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c  |  3 +++
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c  |  2 ++
>  drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c  |  2 ++
>  19 files changed, 55 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> index 3b7d3844a74bc..f0b7080dccb8d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> @@ -135,17 +135,9 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
>  	} else if (amdgpu_gpu_recovery && ring->funcs->reset) {
>  		dev_err(adev->dev, "Starting %s ring reset\n",
>  			s_job->sched->name);
> -
> -		/*
> -		 * Stop the scheduler to prevent anybody else from touching the
> -		 * ring buffer.
> -		 */
> -		drm_sched_wqueue_stop(&ring->sched);
> -
>  		r = amdgpu_ring_reset(ring, job->vmid, NULL);
>  		if (!r) {
>  			atomic_inc(&ring->adev->gpu_reset_counter);
> -			drm_sched_wqueue_start(&ring->sched);
>  			dev_err(adev->dev, "Ring %s reset succeeded\n",
>  				ring->sched.name);
>  			drm_dev_wedged_event(adev_to_drm(adev),
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> index cf5733d5d26dd..7e26a44dcc1fd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> @@ -554,22 +554,16 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id)
>  	struct amdgpu_sdma_instance *sdma_instance = &adev->sdma.instance[instance_id];
>  	struct amdgpu_ring *gfx_ring = &sdma_instance->ring;
>  	struct amdgpu_ring *page_ring = &sdma_instance->page;
> -	bool gfx_sched_stopped = false, page_sched_stopped = false;
>  
>  	mutex_lock(&sdma_instance->engine_reset_mutex);
>  	/* Stop the scheduler's work queue for the GFX and page rings if they are running.
>  	* This ensures that no new tasks are submitted to the queues while
>  	* the reset is in progress.
>  	*/
> -	if (!amdgpu_ring_sched_ready(gfx_ring)) {
> -		drm_sched_wqueue_stop(&gfx_ring->sched);
> -		gfx_sched_stopped = true;
> -	}
> +	drm_sched_wqueue_stop(&gfx_ring->sched);
>  
> -	if (adev->sdma.has_page_queue && !amdgpu_ring_sched_ready(page_ring)) {
> +	if (adev->sdma.has_page_queue)
>  		drm_sched_wqueue_stop(&page_ring->sched);
> -		page_sched_stopped = true;
> -	}
>  
>  	if (sdma_instance->funcs->stop_kernel_queue) {
>  		sdma_instance->funcs->stop_kernel_queue(gfx_ring);
> @@ -596,12 +590,9 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id)
>  	 * to be submitted to the queues after the reset is complete.
>  	 */
>  	if (!ret) {
> -		if (gfx_sched_stopped && amdgpu_ring_sched_ready(gfx_ring)) {
> -			drm_sched_wqueue_start(&gfx_ring->sched);
> -		}
> -		if (page_sched_stopped && amdgpu_ring_sched_ready(page_ring)) {
> +		drm_sched_wqueue_start(&gfx_ring->sched);
> +		if (adev->sdma.has_page_queue)
>  			drm_sched_wqueue_start(&page_ring->sched);
> -		}
>  	}
>  	mutex_unlock(&sdma_instance->engine_reset_mutex);
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> index 4d0ee3ffe9858..8c377ecbb8a75 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> @@ -9540,6 +9540,8 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
>  	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	spin_lock_irqsave(&kiq->ring_lock, flags);
>  
>  	if (amdgpu_ring_alloc(kiq_ring, 5 + 7 + 7 + kiq->pmf->map_queues_size)) {
> @@ -9581,6 +9583,7 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> @@ -9600,6 +9603,8 @@ static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	spin_lock_irqsave(&kiq->ring_lock, flags);
>  
>  	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
> @@ -9658,6 +9663,7 @@ static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> index 39f4dd18c277b..37dcec2d07841 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> @@ -6821,6 +6821,8 @@ static int gfx_v11_0_reset_kgq(struct amdgpu_ring *ring,
>  	if (amdgpu_sriov_vf(adev))
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, false);
>  	if (r) {
>  
> @@ -6846,6 +6848,7 @@ static int gfx_v11_0_reset_kgq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> @@ -6989,6 +6992,8 @@ static int gfx_v11_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (amdgpu_sriov_vf(adev))
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, true);
>  	if (r) {
>  		dev_warn(adev->dev, "fail(%d) to reset kcq and try pipe reset\n", r);
> @@ -7012,6 +7017,7 @@ static int gfx_v11_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
> index 964fa3f2e2719..e4fc42470cf3e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
> @@ -5317,6 +5317,8 @@ static int gfx_v12_0_reset_kgq(struct amdgpu_ring *ring,
>  	if (amdgpu_sriov_vf(adev))
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, false);
>  	if (r) {
>  		dev_warn(adev->dev, "reset via MES failed and try pipe reset %d\n", r);
> @@ -5341,6 +5343,7 @@ static int gfx_v12_0_reset_kgq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> @@ -5437,6 +5440,8 @@ static int gfx_v12_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (amdgpu_sriov_vf(adev))
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, true);
>  	if (r) {
>  		dev_warn(adev->dev, "fail(%d) to reset kcq  and try pipe reset\n", r);
> @@ -5460,6 +5465,7 @@ static int gfx_v12_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index 95e319974f221..76ba664efecb3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -7187,6 +7187,8 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	spin_lock_irqsave(&kiq->ring_lock, flags);
>  
>  	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
> @@ -7247,6 +7249,7 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
> index 8bfee17a826e2..daed0f187bda5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
> @@ -3567,6 +3567,8 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,
>  	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	spin_lock_irqsave(&kiq->ring_lock, flags);
>  
>  	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
> @@ -3625,6 +3627,7 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> index 6621a7b1f29fc..781a5a8a83614 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> @@ -770,12 +770,14 @@ static int jpeg_v2_0_ring_reset(struct amdgpu_ring *ring,
>  {
>  	int r;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	jpeg_v2_0_stop(ring->adev);
>  	jpeg_v2_0_start(ring->adev);
>  	r = amdgpu_ring_test_helper(ring);
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> index 44a5c0e82ca43..5be9cdcae32c1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> @@ -649,12 +649,14 @@ static int jpeg_v2_5_ring_reset(struct amdgpu_ring *ring,
>  {
>  	int r;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	jpeg_v2_5_stop_inst(ring->adev, ring->me);
>  	jpeg_v2_5_start_inst(ring->adev, ring->me);
>  	r = amdgpu_ring_test_helper(ring);
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> index e813af4eedd21..a24bd833d6442 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> @@ -561,12 +561,14 @@ static int jpeg_v3_0_ring_reset(struct amdgpu_ring *ring,
>  {
>  	int r;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	jpeg_v3_0_stop(ring->adev);
>  	jpeg_v3_0_start(ring->adev);
>  	r = amdgpu_ring_test_helper(ring);
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> index 190f0742d7016..1d4edd77837d0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> @@ -729,12 +729,14 @@ static int jpeg_v4_0_ring_reset(struct amdgpu_ring *ring,
>  	if (amdgpu_sriov_vf(ring->adev))
>  		return -EINVAL;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	jpeg_v4_0_stop(ring->adev);
>  	jpeg_v4_0_start(ring->adev);
>  	r = amdgpu_ring_test_helper(ring);
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> 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 04755b7a62d9b..78441f8fce972 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
> @@ -1152,12 +1152,14 @@ static int jpeg_v4_0_3_ring_reset(struct amdgpu_ring *ring,
>  	if (amdgpu_sriov_vf(ring->adev))
>  		return -EOPNOTSUPP;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	jpeg_v4_0_3_core_stall_reset(ring);
>  	jpeg_v4_0_3_start_jrbc(ring);
>  	r = amdgpu_ring_test_helper(ring);
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> 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 e7f942dc714a7..6f8a16da9d608 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
> @@ -843,12 +843,14 @@ static int jpeg_v5_0_1_ring_reset(struct amdgpu_ring *ring,
>  	if (amdgpu_sriov_vf(ring->adev))
>  		return -EOPNOTSUPP;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	jpeg_v5_0_1_core_stall_reset(ring);
>  	jpeg_v5_0_1_init_jrbc(ring);
>  	r = amdgpu_ring_test_helper(ring);
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> index 4b6a799704f1f..103e5ec7aa63b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> @@ -1586,6 +1586,8 @@ static int sdma_v6_0_reset_queue(struct amdgpu_ring *ring,
>  		return -EINVAL;
>  	}
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	r = amdgpu_mes_reset_legacy_queue(adev, ring, vmid, true);
>  	if (r)
>  		return r;
> @@ -1594,6 +1596,7 @@ static int sdma_v6_0_reset_queue(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> index b00c63812899d..99a080bad2a3d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> @@ -822,6 +822,8 @@ static int sdma_v7_0_reset_queue(struct amdgpu_ring *ring,
>  		return -EINVAL;
>  	}
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	r = amdgpu_mes_reset_legacy_queue(adev, ring, vmid, true);
>  	if (r)
>  		return r;
> @@ -830,6 +832,7 @@ static int sdma_v7_0_reset_queue(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> index 6c25e9fc4f0f9..eec9133e1b2c4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> @@ -1978,6 +1978,7 @@ static int vcn_v4_0_ring_reset(struct amdgpu_ring *ring,
>  	if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
>  		return -EOPNOTSUPP;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	vcn_v4_0_stop(vinst);
>  	vcn_v4_0_start(vinst);
>  
> @@ -1985,6 +1986,7 @@ static int vcn_v4_0_ring_reset(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> 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 1e1dd61b774ec..d8fd32c1e38ec 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> @@ -1609,6 +1609,8 @@ static int vcn_v4_0_3_ring_reset(struct amdgpu_ring *ring,
>  	if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
>  		return -EOPNOTSUPP;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
> +
>  	vcn_inst = GET_INST(VCN, ring->me);
>  	r = amdgpu_dpm_reset_vcn(adev, 1 << vcn_inst);
>  
> @@ -1626,6 +1628,7 @@ static int vcn_v4_0_3_ring_reset(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> 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 9c02446bb1a54..7e37ddea63550 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> @@ -1476,6 +1476,7 @@ static int vcn_v4_0_5_ring_reset(struct amdgpu_ring *ring,
>  	if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
>  		return -EOPNOTSUPP;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	vcn_v4_0_5_stop(vinst);
>  	vcn_v4_0_5_start(vinst);
>  
> @@ -1483,6 +1484,7 @@ static int vcn_v4_0_5_ring_reset(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  
> 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 c8924f97cf58a..47c0bcc9e7d80 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> @@ -1203,6 +1203,7 @@ static int vcn_v5_0_0_ring_reset(struct amdgpu_ring *ring,
>  	if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
>  		return -EOPNOTSUPP;
>  
> +	drm_sched_wqueue_stop(&ring->sched);
>  	vcn_v5_0_0_stop(vinst);
>  	vcn_v5_0_0_start(vinst);
>  
> @@ -1210,6 +1211,7 @@ static int vcn_v5_0_0_ring_reset(struct amdgpu_ring *ring,
>  	if (r)
>  		return r;
>  	amdgpu_fence_driver_force_completion(ring);
> +	drm_sched_wqueue_start(&ring->sched);
>  	return 0;
>  }
>  



More information about the amd-gfx mailing list