aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1851-drm-scheduler-Add-flag-to-hint-the-release-of-guilty.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1851-drm-scheduler-Add-flag-to-hint-the-release-of-guilty.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1851-drm-scheduler-Add-flag-to-hint-the-release-of-guilty.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1851-drm-scheduler-Add-flag-to-hint-the-release-of-guilty.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1851-drm-scheduler-Add-flag-to-hint-the-release-of-guilty.patch
new file mode 100644
index 00000000..6ce9d64f
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1851-drm-scheduler-Add-flag-to-hint-the-release-of-guilty.patch
@@ -0,0 +1,81 @@
+From 854071a4ef27a0f5956e688dafef059099be04d0 Mon Sep 17 00:00:00 2001
+From: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
+Date: Thu, 18 Apr 2019 10:48:29 -0400
+Subject: [PATCH 1851/2940] drm/scheduler: Add flag to hint the release of
+ guilty job.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Problem:
+Sched thread's cleanup function races against TO handler
+and removes the guilty job from mirror list and we
+have no way of differentiating if the job was removed from within the
+TO handler or from the sched thread's clean-up function.
+
+Fix:
+Add a flag to scheduler to hint the TO handler that the guilty job needs
+to be explicitly released.
+
+Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Chaudhary Amit Kumar <Chaudharyamit.Kumar@amd.com>
+---
+ drivers/gpu/drm/scheduler/sched_main.c | 9 +++++++--
+ include/drm/gpu_scheduler.h | 2 ++
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
+index 30565d17e82e..ce614457b884 100644
+--- a/drivers/gpu/drm/scheduler/sched_main.c
++++ b/drivers/gpu/drm/scheduler/sched_main.c
+@@ -295,8 +295,10 @@ static void drm_sched_job_timedout(struct work_struct *work)
+ * Guilty job did complete and hence needs to be manually removed
+ * See drm_sched_stop doc.
+ */
+- if (list_empty(&job->node))
++ if (sched->free_guilty) {
+ job->sched->ops->free_job(job);
++ sched->free_guilty = false;
++ }
+
+ spin_lock_irqsave(&sched->job_list_lock, flags);
+ drm_sched_start_timeout(sched);
+@@ -397,10 +399,13 @@ void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad)
+
+ /*
+ * We must keep bad job alive for later use during
+- * recovery by some of the drivers
++ * recovery by some of the drivers but leave a hint
++ * that the guilty job must be released.
+ */
+ if (bad != s_job)
+ sched->ops->free_job(s_job);
++ else
++ sched->free_guilty = true;
+ }
+ }
+
+diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
+index ca71df7da495..4d877441145e 100644
+--- a/include/drm/gpu_scheduler.h
++++ b/include/drm/gpu_scheduler.h
+@@ -256,6 +256,7 @@ struct drm_sched_backend_ops {
+ * guilty and it will be considered for scheduling further.
+ * @num_jobs: the number of jobs in queue in the scheduler
+ * @ready: marks if the underlying HW is ready to work
++ * @free_guilty: A hit to time out handler to free the guilty job.
+ *
+ * One scheduler is implemented for each hardware ring.
+ */
+@@ -276,6 +277,7 @@ struct drm_gpu_scheduler {
+ int hang_limit;
+ atomic_t num_jobs;
+ bool ready;
++ bool free_guilty;
+ };
+
+ int drm_sched_init(struct drm_gpu_scheduler *sched,
+--
+2.17.1
+