Commit 573edb24 authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/scheduler: fix last_scheduled handling

Make sure we access last_scheduled only after checking that there are no
more jobs on the entity.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarNayan Deshmukh <nayan26deshmukh@gmail.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 93f15e1c
......@@ -565,19 +565,20 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job,
struct drm_sched_entity *entity)
{
struct drm_sched_rq *rq = entity->rq;
bool first, reschedule, idle;
bool first;
idle = entity->last_scheduled == NULL ||
dma_fence_is_signaled(entity->last_scheduled);
first = spsc_queue_count(&entity->job_queue) == 0;
reschedule = idle && first && (entity->num_rq_list > 1);
if (first && (entity->num_rq_list > 1)) {
struct dma_fence *fence;
if (reschedule) {
rq = drm_sched_entity_get_free_sched(entity);
spin_lock(&entity->rq_lock);
drm_sched_rq_remove_entity(entity->rq, entity);
entity->rq = rq;
spin_unlock(&entity->rq_lock);
fence = READ_ONCE(entity->last_scheduled);
if (fence == NULL || dma_fence_is_signaled(fence)) {
rq = drm_sched_entity_get_free_sched(entity);
spin_lock(&entity->rq_lock);
drm_sched_rq_remove_entity(entity->rq, entity);
entity->rq = rq;
spin_unlock(&entity->rq_lock);
}
}
sched_job->sched = entity->rq->sched;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment