diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2015-12-11 05:22:52 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-12-14 19:41:19 -0500 |
commit | e8deea2d4bb441751a4c1730495fa9810a208de5 (patch) | |
tree | 4486b5a3d6befcfe737fe9e4471af7bc7e22d532 | |
parent | 2c1a27840394428d8f44fe5d7509dd20574d0573 (diff) |
drm/amdgpu: add entity only when first job come
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>
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c index 5ace1a74071f..8b2becd1aa07 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | |||
@@ -47,6 +47,8 @@ static void amd_sched_rq_init(struct amd_sched_rq *rq) | |||
47 | static void amd_sched_rq_add_entity(struct amd_sched_rq *rq, | 47 | static void amd_sched_rq_add_entity(struct amd_sched_rq *rq, |
48 | struct amd_sched_entity *entity) | 48 | struct amd_sched_entity *entity) |
49 | { | 49 | { |
50 | if (!list_empty(&entity->list)) | ||
51 | return; | ||
50 | spin_lock(&rq->lock); | 52 | spin_lock(&rq->lock); |
51 | list_add_tail(&entity->list, &rq->entities); | 53 | list_add_tail(&entity->list, &rq->entities); |
52 | spin_unlock(&rq->lock); | 54 | spin_unlock(&rq->lock); |
@@ -55,6 +57,8 @@ static void amd_sched_rq_add_entity(struct amd_sched_rq *rq, | |||
55 | static void amd_sched_rq_remove_entity(struct amd_sched_rq *rq, | 57 | static void amd_sched_rq_remove_entity(struct amd_sched_rq *rq, |
56 | struct amd_sched_entity *entity) | 58 | struct amd_sched_entity *entity) |
57 | { | 59 | { |
60 | if (list_empty(&entity->list)) | ||
61 | return; | ||
58 | spin_lock(&rq->lock); | 62 | spin_lock(&rq->lock); |
59 | list_del_init(&entity->list); | 63 | list_del_init(&entity->list); |
60 | if (rq->current_entity == entity) | 64 | if (rq->current_entity == entity) |
@@ -138,9 +142,6 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched, | |||
138 | atomic_set(&entity->fence_seq, 0); | 142 | atomic_set(&entity->fence_seq, 0); |
139 | entity->fence_context = fence_context_alloc(1); | 143 | entity->fence_context = fence_context_alloc(1); |
140 | 144 | ||
141 | /* Add the entity to the run queue */ | ||
142 | amd_sched_rq_add_entity(rq, entity); | ||
143 | |||
144 | return 0; | 145 | return 0; |
145 | } | 146 | } |
146 | 147 | ||
@@ -302,9 +303,11 @@ static bool amd_sched_entity_in(struct amd_sched_job *sched_job) | |||
302 | spin_unlock(&entity->queue_lock); | 303 | spin_unlock(&entity->queue_lock); |
303 | 304 | ||
304 | /* first job wakes up scheduler */ | 305 | /* first job wakes up scheduler */ |
305 | if (first) | 306 | if (first) { |
307 | /* Add the entity to the run queue */ | ||
308 | amd_sched_rq_add_entity(entity->rq, entity); | ||
306 | amd_sched_wakeup(sched); | 309 | amd_sched_wakeup(sched); |
307 | 310 | } | |
308 | return added; | 311 | return added; |
309 | } | 312 | } |
310 | 313 | ||