From f10b3de5283d0c196459f18160161e48cfadae81 Mon Sep 17 00:00:00 2001 From: Sidath Senanayake Date: Thu, 27 Sep 2018 14:34:14 +0200 Subject: 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 Change-Id: I09fe49ca693dfde616dd8d6b8c3e5b178a47e9f8 --- mali_kbase/mali_kbase_debug_job_fault.c | 38 +++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'mali_kbase/mali_kbase_debug_job_fault.c') 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) -- cgit v1.2.3