diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4291-drm-sched-Set-error-to-s_fence-if-HW-job-submission.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4291-drm-sched-Set-error-to-s_fence-if-HW-job-submission.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4291-drm-sched-Set-error-to-s_fence-if-HW-job-submission.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4291-drm-sched-Set-error-to-s_fence-if-HW-job-submission.patch new file mode 100644 index 00000000..92572316 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4291-drm-sched-Set-error-to-s_fence-if-HW-job-submission.patch @@ -0,0 +1,79 @@ +From a249f6b33e15ee4b699ff10e980ce9de66f7d3e8 Mon Sep 17 00:00:00 2001 +From: Andrey Grodzovsky <andrey.grodzovsky@amd.com> +Date: Thu, 12 Dec 2019 13:36:40 +0530 +Subject: [PATCH 4291/4736] drm/sched: Set error to s_fence if HW job + submission +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Problem: +When run_job fails and HW fence returned is NULL we still signal +the s_fence to avoid hangs but the user has no way of knowing if +the actual HW job was ran and finished. + +Fix: +Allow .run_job implementations to return ERR_PTR in the fence pointer +returned and then set this error for s_fence->finished fence so whoever +wait on this fence can inspect the signaled fence for an error. + +Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> +Reviewed-by: Christian König <christian.koenig@amd.com> +Signed-off-by: Rahul Kumar <rahul.kumar1@amd.com> +--- + drivers/gpu/drm/scheduler/sched_main.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c +index 9f362bb84d48..cef586235eaf 100644 +--- a/drivers/gpu/drm/scheduler/sched_main.c ++++ b/drivers/gpu/drm/scheduler/sched_main.c +@@ -481,6 +481,7 @@ void drm_sched_resubmit_jobs(struct drm_gpu_scheduler *sched) + struct drm_sched_job *s_job, *tmp; + uint64_t guilty_context; + bool found_guilty = false; ++ struct dma_fence *fence; + + list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) { + struct drm_sched_fence *s_fence = s_job->s_fence; +@@ -494,7 +495,14 @@ void drm_sched_resubmit_jobs(struct drm_gpu_scheduler *sched) + dma_fence_set_error(&s_fence->finished, -ECANCELED); + + dma_fence_put(s_job->s_fence->parent); +- s_job->s_fence->parent = sched->ops->run_job(s_job); ++ fence = sched->ops->run_job(s_job); ++ ++ if (IS_ERR_OR_NULL(fence)) { ++ s_job->s_fence->parent = NULL; ++ dma_fence_set_error(&s_fence->finished, PTR_ERR(fence)); ++ } else { ++ s_job->s_fence->parent = fence; ++ } + } + } + EXPORT_SYMBOL(drm_sched_resubmit_jobs); +@@ -722,7 +730,7 @@ static int drm_sched_main(void *param) + fence = sched->ops->run_job(sched_job); + drm_sched_fence_scheduled(s_fence); + +- if (fence) { ++ if (!IS_ERR_OR_NULL(fence)) { + s_fence->parent = dma_fence_get(fence); + r = dma_fence_add_callback(fence, &sched_job->cb, + drm_sched_process_job); +@@ -732,8 +740,11 @@ static int drm_sched_main(void *param) + DRM_ERROR("fence add callback failed (%d)\n", + r); + dma_fence_put(fence); +- } else ++ } else { ++ ++ dma_fence_set_error(&s_fence->finished, PTR_ERR(fence)); + drm_sched_process_job(NULL, &sched_job->cb); ++ } + + wake_up(&sched->job_scheduled); + } +-- +2.17.1 + |