diff options
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0480-drm-amdgpu-rework-scheduler-submission-handling.patch')
-rw-r--r-- | meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0480-drm-amdgpu-rework-scheduler-submission-handling.patch | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0480-drm-amdgpu-rework-scheduler-submission-handling.patch b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0480-drm-amdgpu-rework-scheduler-submission-handling.patch new file mode 100644 index 00000000..5577872f --- /dev/null +++ b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0480-drm-amdgpu-rework-scheduler-submission-handling.patch @@ -0,0 +1,153 @@ +From c746ba222363d2e0b0316b1c0bda21e2646b66f2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Wed, 19 Aug 2015 16:12:15 +0200 +Subject: [PATCH 0480/1050] drm/amdgpu: rework scheduler submission handling. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Remove active_hw_rq and it's protecting queue_lock, they are unused. + +User 32bit atomic for hw_rq_count, 64bits for counting to three is a bit +overkill. + +Cleanup the function name and remove incorrect comments. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com> +--- + drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 43 +++++++-------------------- + drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 5 +--- + 2 files changed, 11 insertions(+), 37 deletions(-) + +diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +index f8d46b0..981420e 100644 +--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c ++++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +@@ -94,25 +94,12 @@ amd_sched_rq_select_entity(struct amd_sched_rq *rq) + } + + /** +- * Note: This function should only been called inside scheduler main +- * function for thread safety, there is no other protection here. +- * return ture if scheduler has something ready to run. +- * +- * For active_hw_rq, there is only one producer(scheduler thread) and +- * one consumer(ISR). It should be safe to use this function in scheduler +- * main thread to decide whether to continue emit more IBs. +-*/ +-static bool is_scheduler_ready(struct amd_gpu_scheduler *sched) ++ * Return ture if we can push more jobs to the hw. ++ */ ++static bool amd_sched_ready(struct amd_gpu_scheduler *sched) + { +- unsigned long flags; +- bool full; +- +- spin_lock_irqsave(&sched->queue_lock, flags); +- full = atomic64_read(&sched->hw_rq_count) < +- sched->hw_submission_limit ? true : false; +- spin_unlock_irqrestore(&sched->queue_lock, flags); +- +- return full; ++ return atomic_read(&sched->hw_rq_count) < ++ sched->hw_submission_limit; + } + + /** +@@ -124,7 +111,7 @@ select_context(struct amd_gpu_scheduler *sched) + struct amd_sched_entity *wake_entity = NULL; + struct amd_sched_entity *tmp; + +- if (!is_scheduler_ready(sched)) ++ if (!amd_sched_ready(sched)) + return NULL; + + /* Kernel run queue has higher priority than normal run queue*/ +@@ -293,14 +280,10 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb) + struct amd_sched_job *sched_job = + container_of(cb, struct amd_sched_job, cb); + struct amd_gpu_scheduler *sched; +- unsigned long flags; + + sched = sched_job->sched; + amd_sched_fence_signal(sched_job->s_fence); +- spin_lock_irqsave(&sched->queue_lock, flags); +- list_del(&sched_job->list); +- atomic64_dec(&sched->hw_rq_count); +- spin_unlock_irqrestore(&sched->queue_lock, flags); ++ atomic_dec(&sched->hw_rq_count); + fence_put(&sched_job->s_fence->base); + sched->ops->process_job(sched, sched_job); + wake_up_interruptible(&sched->wait_queue); +@@ -320,7 +303,7 @@ static int amd_sched_main(void *param) + struct fence *fence; + + wait_event_interruptible(sched->wait_queue, +- is_scheduler_ready(sched) && ++ amd_sched_ready(sched) && + (c_entity = select_context(sched))); + r = kfifo_out(&c_entity->job_queue, &job, sizeof(void *)); + if (r != sizeof(void *)) +@@ -329,11 +312,7 @@ static int amd_sched_main(void *param) + if (sched->ops->prepare_job) + r = sched->ops->prepare_job(sched, c_entity, job); + if (!r) { +- unsigned long flags; +- spin_lock_irqsave(&sched->queue_lock, flags); +- list_add_tail(&job->list, &sched->active_hw_rq); +- atomic64_inc(&sched->hw_rq_count); +- spin_unlock_irqrestore(&sched->queue_lock, flags); ++ atomic_inc(&sched->hw_rq_count); + } + mutex_lock(&sched->sched_lock); + fence = sched->ops->run_job(sched, c_entity, job); +@@ -384,13 +363,11 @@ struct amd_gpu_scheduler *amd_sched_create(void *device, + sched->hw_submission_limit = hw_submission; + snprintf(name, sizeof(name), "gpu_sched[%d]", ring); + mutex_init(&sched->sched_lock); +- spin_lock_init(&sched->queue_lock); + amd_sched_rq_init(&sched->sched_rq); + amd_sched_rq_init(&sched->kernel_rq); + + init_waitqueue_head(&sched->wait_queue); +- INIT_LIST_HEAD(&sched->active_hw_rq); +- atomic64_set(&sched->hw_rq_count, 0); ++ atomic_set(&sched->hw_rq_count, 0); + /* Each scheduler will run on a seperate kernel thread */ + sched->thread = kthread_create(amd_sched_main, sched, name); + if (sched->thread) { +diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +index d328e96..81c00da 100644 +--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h ++++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +@@ -74,7 +74,6 @@ struct amd_sched_fence { + }; + + struct amd_sched_job { +- struct list_head list; + struct fence_cb cb; + struct amd_gpu_scheduler *sched; + struct amd_sched_entity *s_entity; +@@ -115,8 +114,7 @@ struct amd_gpu_scheduler { + struct task_struct *thread; + struct amd_sched_rq sched_rq; + struct amd_sched_rq kernel_rq; +- struct list_head active_hw_rq; +- atomic64_t hw_rq_count; ++ atomic_t hw_rq_count; + struct amd_sched_backend_ops *ops; + uint32_t ring_id; + uint32_t granularity; /* in ms unit */ +@@ -124,7 +122,6 @@ struct amd_gpu_scheduler { + wait_queue_head_t wait_queue; + struct amd_sched_entity *current_entity; + struct mutex sched_lock; +- spinlock_t queue_lock; + uint32_t hw_submission_limit; + }; + +-- +1.9.1 + |