Issue: jobs submitted to a killed entity can still succeed, except for a dmesg error when the job is the first been pushed to the killed entity
Force-signal fence when job is submitted to killed entity Signed-off-by: Emily Deng <[email protected]> Signed-off-by: Bingxi Guo <[email protected]> --- drivers/gpu/drm/scheduler/sched_entity.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c index 8867b95ab089..998e35a1a261 100644 --- a/drivers/gpu/drm/scheduler/sched_entity.c +++ b/drivers/gpu/drm/scheduler/sched_entity.c @@ -570,6 +570,14 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job) bool first; ktime_t submit_ts; + spin_lock(&entity->lock); + if (entity->stopped) { + spin_unlock(&entity->lock); + DRM_ERROR("Trying to push job to a killed entity\n"); + goto error; + } + spin_unlock(&entity->lock); + trace_drm_sched_job_queue(sched_job, entity); if (trace_drm_sched_job_add_dep_enabled()) { @@ -597,12 +605,6 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job) /* Add the entity to the run queue */ spin_lock(&entity->lock); - if (entity->stopped) { - spin_unlock(&entity->lock); - - DRM_ERROR("Trying to push to a killed entity\n"); - return; - } rq = entity->rq; sched = rq->sched; @@ -618,5 +620,12 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job) drm_sched_wakeup(sched); } + + return; + +error: + dma_fence_set_error(&sched_job->s_fence->finished, -EPERM); + drm_sched_fence_scheduled(sched_job->s_fence, NULL); + drm_sched_fence_finished(sched_job->s_fence, -EPERM); } EXPORT_SYMBOL(drm_sched_entity_push_job); -- 2.43.0
