summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_debug_job_fault.c
diff options
context:
space:
mode:
authorSidath Senanayake <sidaths@google.com>2018-09-27 14:34:14 +0200
committerSidath Senanayake <sidaths@google.com>2018-09-27 14:34:14 +0200
commitf10b3de5283d0c196459f18160161e48cfadae81 (patch)
tree7123dda75768c8b90b15c58523a7509a7c93a35b /mali_kbase/mali_kbase_debug_job_fault.c
parentf32af5a9ba3c2b556d92827a96dbeec3df200968 (diff)
downloadgpu-f10b3de5283d0c196459f18160161e48cfadae81.tar.gz
Mali Bifrost DDK r15p0 KMD
Provenance: c4c373c4f (collaborate/EAC/b_r15p0) BX304L01B-BU-00000-r15p0-01rel0 BX304L06A-BU-00000-r15p0-01rel0 BX304X07X-BU-00000-r15p0-01rel0 Signed-off-by: Sidath Senanayake <sidaths@google.com> Change-Id: I09fe49ca693dfde616dd8d6b8c3e5b178a47e9f8
Diffstat (limited to 'mali_kbase/mali_kbase_debug_job_fault.c')
-rw-r--r--mali_kbase/mali_kbase_debug_job_fault.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/mali_kbase/mali_kbase_debug_job_fault.c b/mali_kbase/mali_kbase_debug_job_fault.c
index d2c09d6..0029fe3 100644
--- a/mali_kbase/mali_kbase_debug_job_fault.c
+++ b/mali_kbase/mali_kbase_debug_job_fault.c
@@ -1,6 +1,6 @@
/*
*
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018 ARM Limited. All rights reserved.
*
* This program is free software and is provided to you under the terms of the
* GNU General Public License version 2 as published by the Free Software
@@ -39,6 +39,30 @@ static bool kbase_is_job_fault_event_pending(struct kbase_device *kbdev)
return ret;
}
+static void kbase_ctx_remove_pending_event(struct kbase_context *kctx)
+{
+ struct list_head *event_list = &kctx->kbdev->job_fault_event_list;
+ struct base_job_fault_event *event;
+ unsigned long flags;
+
+ spin_lock_irqsave(&kctx->kbdev->job_fault_event_lock, flags);
+ list_for_each_entry(event, event_list, head) {
+ if (event->katom->kctx == kctx) {
+ list_del(&event->head);
+ spin_unlock_irqrestore(&kctx->kbdev->job_fault_event_lock, flags);
+
+ wake_up(&kctx->kbdev->job_fault_resume_wq);
+ flush_work(&event->job_fault_work);
+
+ /* job_fault_event_list can only have a single atom for
+ * each context.
+ */
+ return;
+ }
+ }
+ spin_unlock_irqrestore(&kctx->kbdev->job_fault_event_lock, flags);
+}
+
static bool kbase_ctx_has_no_event_pending(struct kbase_context *kctx)
{
struct kbase_device *kbdev = kctx->kbdev;
@@ -71,7 +95,7 @@ static int kbase_job_fault_event_wait(struct kbase_device *kbdev,
unsigned long flags;
spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
- if (list_empty(event_list)) {
+ while (list_empty(event_list)) {
spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
if (wait_event_interruptible(kbdev->job_fault_wq,
kbase_is_job_fault_event_pending(kbdev)))
@@ -237,6 +261,9 @@ bool kbase_debug_job_fault_process(struct kbase_jd_atom *katom,
return true;
}
+ if (kbase_ctx_flag(kctx, KCTX_DYING))
+ return false;
+
if (kctx->kbdev->job_fault_debug == true) {
if (completion_code != BASE_JD_EVENT_DONE) {
@@ -488,6 +515,13 @@ void kbase_debug_job_fault_context_term(struct kbase_context *kctx)
vfree(kctx->reg_dump);
}
+void kbase_debug_job_fault_kctx_unblock(struct kbase_context *kctx)
+{
+ WARN_ON(!kbase_ctx_flag(kctx, KCTX_DYING));
+
+ kbase_ctx_remove_pending_event(kctx);
+}
+
#else /* CONFIG_DEBUG_FS */
int kbase_debug_job_fault_dev_init(struct kbase_device *kbdev)