drm/amdgpu: add entity only when first job come
authorChunming Zhou <David1.Zhou@amd.com>
Fri, 11 Dec 2015 10:22:52 +0000 (18:22 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Dec 2015 00:41:19 +0000 (19:41 -0500)
umd somtimes will create a context for every ring,
that means some entities wouldn't be used at all.

Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c

index 5ace1a74071f2c23a98cc17b141c31bab2347def..8b2becd1aa079977525a2c513005fa67f2ad0ca5 100644 (file)
@@ -47,6 +47,8 @@ static void amd_sched_rq_init(struct amd_sched_rq *rq)
 static void amd_sched_rq_add_entity(struct amd_sched_rq *rq,
                                    struct amd_sched_entity *entity)
 {
+       if (!list_empty(&entity->list))
+               return;
        spin_lock(&rq->lock);
        list_add_tail(&entity->list, &rq->entities);
        spin_unlock(&rq->lock);
@@ -55,6 +57,8 @@ static void amd_sched_rq_add_entity(struct amd_sched_rq *rq,
 static void amd_sched_rq_remove_entity(struct amd_sched_rq *rq,
                                       struct amd_sched_entity *entity)
 {
+       if (list_empty(&entity->list))
+               return;
        spin_lock(&rq->lock);
        list_del_init(&entity->list);
        if (rq->current_entity == entity)
@@ -138,9 +142,6 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched,
        atomic_set(&entity->fence_seq, 0);
        entity->fence_context = fence_context_alloc(1);
 
-       /* Add the entity to the run queue */
-       amd_sched_rq_add_entity(rq, entity);
-
        return 0;
 }
 
@@ -302,9 +303,11 @@ static bool amd_sched_entity_in(struct amd_sched_job *sched_job)
        spin_unlock(&entity->queue_lock);
 
        /* first job wakes up scheduler */
-       if (first)
+       if (first) {
+               /* Add the entity to the run queue */
+               amd_sched_rq_add_entity(entity->rq, entity);
                amd_sched_wakeup(sched);
-
+       }
        return added;
 }