diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0485-drm-amdgpu-fix-entity-wakeup-race-condition.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0485-drm-amdgpu-fix-entity-wakeup-race-condition.patch | 124 |
1 files changed, 0 insertions, 124 deletions
diff --git a/common/recipes-kernel/linux/files/0485-drm-amdgpu-fix-entity-wakeup-race-condition.patch b/common/recipes-kernel/linux/files/0485-drm-amdgpu-fix-entity-wakeup-race-condition.patch deleted file mode 100644 index 414ca97e..00000000 --- a/common/recipes-kernel/linux/files/0485-drm-amdgpu-fix-entity-wakeup-race-condition.patch +++ /dev/null @@ -1,124 +0,0 @@ -From aef4852eed2841892796fb1e9abd7f8468384e62 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> -Date: Thu, 20 Aug 2015 14:47:46 +0200 -Subject: [PATCH 0485/1050] drm/amdgpu: fix entity wakeup race condition -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -That actually didn't worked at all. - -Signed-off-by: Christian König <christian.koenig@amd.com> -Reviewed-by: Chunming Zhou <david1.zhou@amd.com> ---- - drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 43 +++++++++++++-------------- - drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 1 - - 2 files changed, 21 insertions(+), 23 deletions(-) - -diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c -index 2dd9c8a..0133697 100644 ---- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c -+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c -@@ -108,7 +108,6 @@ static bool amd_sched_ready(struct amd_gpu_scheduler *sched) - static struct amd_sched_entity * - amd_sched_select_context(struct amd_gpu_scheduler *sched) - { -- struct amd_sched_entity *wake_entity = NULL; - struct amd_sched_entity *tmp; - - if (!amd_sched_ready(sched)) -@@ -119,11 +118,6 @@ amd_sched_select_context(struct amd_gpu_scheduler *sched) - if (tmp == NULL) - tmp = amd_sched_rq_select_entity(&sched->sched_rq); - -- if (sched->current_entity && (sched->current_entity != tmp)) -- wake_entity = sched->current_entity; -- sched->current_entity = tmp; -- if (wake_entity && wake_entity->need_wakeup) -- wake_up(&wake_entity->wait_queue); - return tmp; - } - -@@ -184,16 +178,17 @@ static bool is_context_entity_initialized(struct amd_gpu_scheduler *sched, - entity->belongto_rq != NULL; - } - --static bool is_context_entity_idle(struct amd_gpu_scheduler *sched, -- struct amd_sched_entity *entity) -+/** -+ * Check if entity is idle -+ * -+ * @entity The pointer to a valid scheduler entity -+ * -+ * Return true if entity don't has any unscheduled jobs. -+ */ -+static bool amd_sched_entity_is_idle(struct amd_sched_entity *entity) - { -- /** -- * Idle means no pending IBs, and the entity is not -- * currently being used. -- */ -- barrier(); -- if ((sched->current_entity != entity) && -- kfifo_is_empty(&entity->job_queue)) -+ rmb(); -+ if (kfifo_is_empty(&entity->job_queue)) - return true; - - return false; -@@ -210,8 +205,8 @@ static bool is_context_entity_idle(struct amd_gpu_scheduler *sched, - int amd_sched_entity_fini(struct amd_gpu_scheduler *sched, - struct amd_sched_entity *entity) - { -- int r = 0; - struct amd_sched_rq *rq = entity->belongto_rq; -+ long r; - - if (!is_context_entity_initialized(sched, entity)) - return 0; -@@ -220,13 +215,11 @@ int amd_sched_entity_fini(struct amd_gpu_scheduler *sched, - * The client will not queue more IBs during this fini, consume existing - * queued IBs - */ -- r = wait_event_timeout( -- entity->wait_queue, -- is_context_entity_idle(sched, entity), -- msecs_to_jiffies(AMD_GPU_WAIT_IDLE_TIMEOUT_IN_MS) -- ) ? 0 : -1; -+ r = wait_event_timeout(entity->wait_queue, -+ amd_sched_entity_is_idle(entity), -+ msecs_to_jiffies(AMD_GPU_WAIT_IDLE_TIMEOUT_IN_MS)); - -- if (r) -+ if (r <= 0) - DRM_INFO("Entity %p is in waiting state during fini\n", - entity); - -@@ -325,6 +318,12 @@ static int amd_sched_main(void *param) - fence_put(fence); - } - mutex_unlock(&sched->sched_lock); -+ -+ if (c_entity->need_wakeup) { -+ c_entity->need_wakeup = false; -+ wake_up(&c_entity->wait_queue); -+ } -+ - } - return 0; - } -diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h -index bbfcc37..d4116bb 100644 ---- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h -+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h -@@ -117,7 +117,6 @@ struct amd_gpu_scheduler { - uint32_t granularity; /* in ms unit */ - uint32_t preemption; - wait_queue_head_t wait_queue; -- struct amd_sched_entity *current_entity; - struct mutex sched_lock; - uint32_t hw_submission_limit; - }; --- -1.9.1 - |