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

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
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -565,20 +565,21 @@ 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) {
		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;
	sched_job->s_fence->sched = entity->rq->sched;