mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
drm/sched: Rename DRM_GPU_SCHED_STAT_NOMINAL to DRM_GPU_SCHED_STAT_RESET
Among the scheduler's statuses, the only one that indicates an error is DRM_GPU_SCHED_STAT_ENODEV. Any status other than DRM_GPU_SCHED_STAT_ENODEV signifies that the operation succeeded and the GPU is in a nominal state. However, to provide more information about the GPU's status, it is needed to convey more information than just "OK". Therefore, rename DRM_GPU_SCHED_STAT_NOMINAL to DRM_GPU_SCHED_STAT_RESET, which better communicates the meaning of this status. The status DRM_GPU_SCHED_STAT_RESET indicates that the GPU has hung, but it has been successfully reset and is now in a nominal state again. Reviewed-by: Philipp Stanner <phasta@kernel.org> Link: https://lore.kernel.org/r/20250714-sched-skip-reset-v6-1-5c5ba4f55039@igalia.com Signed-off-by: Maíra Canal <mcanal@igalia.com>
This commit is contained in:
parent
fd5fde69fd
commit
0a5dc1b67e
@ -361,7 +361,7 @@ aie2_sched_job_timedout(struct drm_sched_job *sched_job)
|
|||||||
aie2_hwctx_restart(xdna, hwctx);
|
aie2_hwctx_restart(xdna, hwctx);
|
||||||
mutex_unlock(&xdna->dev_lock);
|
mutex_unlock(&xdna->dev_lock);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct drm_sched_backend_ops sched_ops = {
|
static const struct drm_sched_backend_ops sched_ops = {
|
||||||
|
@ -175,7 +175,7 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
|
|||||||
exit:
|
exit:
|
||||||
amdgpu_vm_put_task_info(ti);
|
amdgpu_vm_put_task_info(ti);
|
||||||
drm_dev_exit(idx);
|
drm_dev_exit(idx);
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||||
|
@ -86,11 +86,11 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job
|
|||||||
drm_sched_resubmit_jobs(&gpu->sched);
|
drm_sched_resubmit_jobs(&gpu->sched);
|
||||||
|
|
||||||
drm_sched_start(&gpu->sched, 0);
|
drm_sched_start(&gpu->sched, 0);
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
|
|
||||||
out_no_timeout:
|
out_no_timeout:
|
||||||
list_add(&sched_job->list, &sched_job->sched->pending_list);
|
list_add(&sched_job->list, &sched_job->sched->pending_list);
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void etnaviv_sched_free_job(struct drm_sched_job *sched_job)
|
static void etnaviv_sched_free_job(struct drm_sched_job *sched_job)
|
||||||
|
@ -803,7 +803,7 @@ static void pvr_queue_start(struct pvr_queue *queue)
|
|||||||
* the scheduler, and re-assign parent fences in the middle.
|
* the scheduler, and re-assign parent fences in the middle.
|
||||||
*
|
*
|
||||||
* Return:
|
* Return:
|
||||||
* * DRM_GPU_SCHED_STAT_NOMINAL.
|
* * DRM_GPU_SCHED_STAT_RESET.
|
||||||
*/
|
*/
|
||||||
static enum drm_gpu_sched_stat
|
static enum drm_gpu_sched_stat
|
||||||
pvr_queue_timedout_job(struct drm_sched_job *s_job)
|
pvr_queue_timedout_job(struct drm_sched_job *s_job)
|
||||||
@ -854,7 +854,7 @@ pvr_queue_timedout_job(struct drm_sched_job *s_job)
|
|||||||
|
|
||||||
drm_sched_start(sched, 0);
|
drm_sched_start(sched, 0);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -412,7 +412,7 @@ static enum drm_gpu_sched_stat lima_sched_timedout_job(struct drm_sched_job *job
|
|||||||
*/
|
*/
|
||||||
if (dma_fence_is_signaled(task->fence)) {
|
if (dma_fence_is_signaled(task->fence)) {
|
||||||
DRM_WARN("%s spurious timeout\n", lima_ip_name(ip));
|
DRM_WARN("%s spurious timeout\n", lima_ip_name(ip));
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -429,7 +429,7 @@ static enum drm_gpu_sched_stat lima_sched_timedout_job(struct drm_sched_job *job
|
|||||||
|
|
||||||
if (dma_fence_is_signaled(task->fence)) {
|
if (dma_fence_is_signaled(task->fence)) {
|
||||||
DRM_WARN("%s unexpectedly high interrupt latency\n", lima_ip_name(ip));
|
DRM_WARN("%s unexpectedly high interrupt latency\n", lima_ip_name(ip));
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -467,7 +467,7 @@ static enum drm_gpu_sched_stat lima_sched_timedout_job(struct drm_sched_job *job
|
|||||||
drm_sched_resubmit_jobs(&pipe->base);
|
drm_sched_resubmit_jobs(&pipe->base);
|
||||||
drm_sched_start(&pipe->base, 0);
|
drm_sched_start(&pipe->base, 0);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lima_sched_free_job(struct drm_sched_job *job)
|
static void lima_sched_free_job(struct drm_sched_job *job)
|
||||||
|
@ -189,7 +189,7 @@ nouveau_exec_job_timeout(struct nouveau_job *job)
|
|||||||
NV_PRINTK(warn, job->cli, "job timeout, channel %d killed!\n",
|
NV_PRINTK(warn, job->cli, "job timeout, channel %d killed!\n",
|
||||||
chan->chid);
|
chan->chid);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct nouveau_job_ops nouveau_exec_job_ops = {
|
static const struct nouveau_job_ops nouveau_exec_job_ops = {
|
||||||
|
@ -370,7 +370,7 @@ nouveau_sched_timedout_job(struct drm_sched_job *sched_job)
|
|||||||
{
|
{
|
||||||
struct drm_gpu_scheduler *sched = sched_job->sched;
|
struct drm_gpu_scheduler *sched = sched_job->sched;
|
||||||
struct nouveau_job *job = to_nouveau_job(sched_job);
|
struct nouveau_job *job = to_nouveau_job(sched_job);
|
||||||
enum drm_gpu_sched_stat stat = DRM_GPU_SCHED_STAT_NOMINAL;
|
enum drm_gpu_sched_stat stat = DRM_GPU_SCHED_STAT_RESET;
|
||||||
|
|
||||||
drm_sched_stop(sched, sched_job);
|
drm_sched_stop(sched, sched_job);
|
||||||
|
|
||||||
|
@ -755,7 +755,7 @@ static enum drm_gpu_sched_stat panfrost_job_timedout(struct drm_sched_job
|
|||||||
* spurious. Bail out.
|
* spurious. Bail out.
|
||||||
*/
|
*/
|
||||||
if (dma_fence_is_signaled(job->done_fence))
|
if (dma_fence_is_signaled(job->done_fence))
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Panfrost IRQ handler may take a long time to process an interrupt
|
* Panfrost IRQ handler may take a long time to process an interrupt
|
||||||
@ -770,7 +770,7 @@ static enum drm_gpu_sched_stat panfrost_job_timedout(struct drm_sched_job
|
|||||||
|
|
||||||
if (dma_fence_is_signaled(job->done_fence)) {
|
if (dma_fence_is_signaled(job->done_fence)) {
|
||||||
dev_warn(pfdev->dev, "unexpectedly high interrupt latency\n");
|
dev_warn(pfdev->dev, "unexpectedly high interrupt latency\n");
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_err(pfdev->dev, "gpu sched timeout, js=%d, config=0x%x, status=0x%x, head=0x%x, tail=0x%x, sched_job=%p",
|
dev_err(pfdev->dev, "gpu sched timeout, js=%d, config=0x%x, status=0x%x, head=0x%x, tail=0x%x, sched_job=%p",
|
||||||
@ -786,7 +786,7 @@ static enum drm_gpu_sched_stat panfrost_job_timedout(struct drm_sched_job
|
|||||||
atomic_set(&pfdev->reset.pending, 1);
|
atomic_set(&pfdev->reset.pending, 1);
|
||||||
panfrost_reset(pfdev, sched_job);
|
panfrost_reset(pfdev, sched_job);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void panfrost_reset_work(struct work_struct *work)
|
static void panfrost_reset_work(struct work_struct *work)
|
||||||
|
@ -2259,7 +2259,7 @@ static enum drm_gpu_sched_stat
|
|||||||
panthor_vm_bind_timedout_job(struct drm_sched_job *sched_job)
|
panthor_vm_bind_timedout_job(struct drm_sched_job *sched_job)
|
||||||
{
|
{
|
||||||
WARN(1, "VM_BIND ops are synchronous for now, there should be no timeout!");
|
WARN(1, "VM_BIND ops are synchronous for now, there should be no timeout!");
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct drm_sched_backend_ops panthor_vm_bind_ops = {
|
static const struct drm_sched_backend_ops panthor_vm_bind_ops = {
|
||||||
|
@ -3241,7 +3241,7 @@ queue_timedout_job(struct drm_sched_job *sched_job)
|
|||||||
|
|
||||||
queue_start(queue);
|
queue_start(queue);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void queue_free_job(struct drm_sched_job *sched_job)
|
static void queue_free_job(struct drm_sched_job *sched_job)
|
||||||
|
@ -527,7 +527,7 @@ static void drm_sched_job_timedout(struct work_struct *work)
|
|||||||
{
|
{
|
||||||
struct drm_gpu_scheduler *sched;
|
struct drm_gpu_scheduler *sched;
|
||||||
struct drm_sched_job *job;
|
struct drm_sched_job *job;
|
||||||
enum drm_gpu_sched_stat status = DRM_GPU_SCHED_STAT_NOMINAL;
|
enum drm_gpu_sched_stat status = DRM_GPU_SCHED_STAT_RESET;
|
||||||
|
|
||||||
sched = container_of(work, struct drm_gpu_scheduler, work_tdr.work);
|
sched = container_of(work, struct drm_gpu_scheduler, work_tdr.work);
|
||||||
|
|
||||||
|
@ -231,7 +231,7 @@ mock_sched_timedout_job(struct drm_sched_job *sched_job)
|
|||||||
drm_sched_job_cleanup(sched_job);
|
drm_sched_job_cleanup(sched_job);
|
||||||
/* Mock job itself is freed by the kunit framework. */
|
/* Mock job itself is freed by the kunit framework. */
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mock_sched_free_job(struct drm_sched_job *sched_job)
|
static void mock_sched_free_job(struct drm_sched_job *sched_job)
|
||||||
|
@ -741,7 +741,7 @@ v3d_gpu_reset_for_timeout(struct v3d_dev *v3d, struct drm_sched_job *sched_job)
|
|||||||
|
|
||||||
mutex_unlock(&v3d->reset_lock);
|
mutex_unlock(&v3d->reset_lock);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -773,7 +773,7 @@ v3d_cl_job_timedout(struct drm_sched_job *sched_job, enum v3d_queue q,
|
|||||||
*timedout_ctra = ctra;
|
*timedout_ctra = ctra;
|
||||||
|
|
||||||
v3d_sched_skip_reset(sched_job);
|
v3d_sched_skip_reset(sched_job);
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
return v3d_gpu_reset_for_timeout(v3d, sched_job);
|
return v3d_gpu_reset_for_timeout(v3d, sched_job);
|
||||||
@ -819,7 +819,7 @@ v3d_csd_job_timedout(struct drm_sched_job *sched_job)
|
|||||||
job->timedout_batches = batches;
|
job->timedout_batches = batches;
|
||||||
|
|
||||||
v3d_sched_skip_reset(sched_job);
|
v3d_sched_skip_reset(sched_job);
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
return v3d_gpu_reset_for_timeout(v3d, sched_job);
|
return v3d_gpu_reset_for_timeout(v3d, sched_job);
|
||||||
|
@ -1096,7 +1096,7 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)
|
|||||||
xe_sched_add_pending_job(sched, job);
|
xe_sched_add_pending_job(sched, job);
|
||||||
xe_sched_submission_start(sched);
|
xe_sched_submission_start(sched);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Kill the run_job entry point */
|
/* Kill the run_job entry point */
|
||||||
@ -1265,7 +1265,7 @@ trigger_reset:
|
|||||||
/* Start fence signaling */
|
/* Start fence signaling */
|
||||||
xe_hw_fence_irq_start(q->fence_irq);
|
xe_hw_fence_irq_start(q->fence_irq);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
|
|
||||||
sched_enable:
|
sched_enable:
|
||||||
enable_scheduling(q);
|
enable_scheduling(q);
|
||||||
@ -1278,7 +1278,7 @@ rearm:
|
|||||||
xe_sched_add_pending_job(sched, job);
|
xe_sched_add_pending_job(sched, job);
|
||||||
xe_sched_submission_start(sched);
|
xe_sched_submission_start(sched);
|
||||||
|
|
||||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
return DRM_GPU_SCHED_STAT_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __guc_exec_queue_fini_async(struct work_struct *w)
|
static void __guc_exec_queue_fini_async(struct work_struct *w)
|
||||||
|
@ -391,12 +391,12 @@ struct drm_sched_job {
|
|||||||
* enum drm_gpu_sched_stat - the scheduler's status
|
* enum drm_gpu_sched_stat - the scheduler's status
|
||||||
*
|
*
|
||||||
* @DRM_GPU_SCHED_STAT_NONE: Reserved. Do not use.
|
* @DRM_GPU_SCHED_STAT_NONE: Reserved. Do not use.
|
||||||
* @DRM_GPU_SCHED_STAT_NOMINAL: Operation succeeded.
|
* @DRM_GPU_SCHED_STAT_RESET: The GPU hung and successfully reset.
|
||||||
* @DRM_GPU_SCHED_STAT_ENODEV: Error: Device is not available anymore.
|
* @DRM_GPU_SCHED_STAT_ENODEV: Error: Device is not available anymore.
|
||||||
*/
|
*/
|
||||||
enum drm_gpu_sched_stat {
|
enum drm_gpu_sched_stat {
|
||||||
DRM_GPU_SCHED_STAT_NONE,
|
DRM_GPU_SCHED_STAT_NONE,
|
||||||
DRM_GPU_SCHED_STAT_NOMINAL,
|
DRM_GPU_SCHED_STAT_RESET,
|
||||||
DRM_GPU_SCHED_STAT_ENODEV,
|
DRM_GPU_SCHED_STAT_ENODEV,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user