drm/amd/sched: move adding finish callback to amd_sched_job_begin
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 28 Sep 2017 09:37:02 +0000 (11:37 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 6 Oct 2017 21:44:27 +0000 (17:44 -0400)
The finish callback is responsible for removing the job from the ring
mirror list, among other things. It makes sense to add it as callback
in the place where the job is added to the ring mirror list.

Signed-off-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Andres Rodriguez <andresx7@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c

index 6e899c593b7eb93f4a22e56909cc58570cd0c23e..e793312e351c42c5878664906392b10c88cc5632 100644 (file)
@@ -395,6 +395,9 @@ static void amd_sched_job_begin(struct amd_sched_job *s_job)
 {
        struct amd_gpu_scheduler *sched = s_job->sched;
 
+       dma_fence_add_callback(&s_job->s_fence->finished, &s_job->finish_cb,
+                              amd_sched_job_finish_cb);
+
        spin_lock(&sched->job_list_lock);
        list_add_tail(&s_job->node, &sched->ring_mirror_list);
        if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
@@ -487,8 +490,6 @@ void amd_sched_entity_push_job(struct amd_sched_job *sched_job)
        struct amd_sched_entity *entity = sched_job->s_entity;
 
        trace_amd_sched_job(sched_job);
-       dma_fence_add_callback(&sched_job->s_fence->finished, &sched_job->finish_cb,
-                              amd_sched_job_finish_cb);
        wait_event(entity->sched->job_scheduled,
                   amd_sched_entity_in(sched_job));
 }