mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
drm/amdgpu: re-add the bad job to the pending list for ring resets
Returning DRM_GPU_SCHED_STAT_NO_HANG causes the scheduler to add the bad job back the pending list. We've already set the errors on the fence and killed the bad job at this point so it's the correct behavior. Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -92,6 +92,7 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
|
||||
struct drm_wedge_task_info *info = NULL;
|
||||
struct amdgpu_task_info *ti = NULL;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
enum drm_gpu_sched_stat status = DRM_GPU_SCHED_STAT_RESET;
|
||||
int idx, r;
|
||||
|
||||
if (!drm_dev_enter(adev_to_drm(adev), &idx)) {
|
||||
@@ -135,13 +136,19 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
|
||||
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, job->hw_fence);
|
||||
if (!r) {
|
||||
/* Start the scheduler again */
|
||||
drm_sched_wqueue_start(&ring->sched);
|
||||
atomic_inc(&ring->adev->gpu_reset_counter);
|
||||
dev_err(adev->dev, "Ring %s reset succeeded\n",
|
||||
ring->sched.name);
|
||||
drm_dev_wedged_event(adev_to_drm(adev),
|
||||
DRM_WEDGE_RECOVERY_NONE, info);
|
||||
/* This is needed to add the job back to the pending list */
|
||||
status = DRM_GPU_SCHED_STAT_NO_HANG;
|
||||
goto exit;
|
||||
}
|
||||
dev_err(adev->dev, "Ring %s reset failed\n", ring->sched.name);
|
||||
@@ -177,7 +184,7 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
|
||||
exit:
|
||||
amdgpu_vm_put_task_info(ti);
|
||||
drm_dev_exit(idx);
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
return status;
|
||||
}
|
||||
|
||||
int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
|
||||
Reference in New Issue
Block a user