summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_vinstr.c
diff options
context:
space:
mode:
authorSidath Senanayake <sidaths@google.com>2017-09-19 18:23:58 +0200
committerSidath Senanayake <sidaths@google.com>2017-09-19 18:23:58 +0200
commitc19c62718d90e8efa4675528aae6ab6fde13a12f (patch)
tree4601ada4314a2641b2ebdb7073198a5a406085f8 /mali_kbase/mali_kbase_vinstr.c
parentea23e535ae857c92d45cb11bdd5dba7c27579726 (diff)
downloadgpu-c19c62718d90e8efa4675528aae6ab6fde13a12f.tar.gz
Mali Bifrost DDK r8p0 KMD
Provenance: a0013c522 (collaborate/EAC/b_r8p0) BX304L01B-BU-00000-r8p0-01rel0 BX304L06A-BU-00000-r8p0-01rel0 BX304X07X-BU-00000-r8p0-01rel0 Signed-off-by: Sidath Senanayake <sidaths@google.com> Change-Id: Iab1f0fc8f3602409180629b210c624791be774c5
Diffstat (limited to 'mali_kbase/mali_kbase_vinstr.c')
-rw-r--r--mali_kbase/mali_kbase_vinstr.c64
1 files changed, 30 insertions, 34 deletions
diff --git a/mali_kbase/mali_kbase_vinstr.c b/mali_kbase/mali_kbase_vinstr.c
index 165841d..ed12945 100644
--- a/mali_kbase/mali_kbase_vinstr.c
+++ b/mali_kbase/mali_kbase_vinstr.c
@@ -373,7 +373,7 @@ static void kbasep_vinstr_unmap_kernel_dump_buffer(
static int kbasep_vinstr_create_kctx(struct kbase_vinstr_context *vinstr_ctx)
{
struct kbase_device *kbdev = vinstr_ctx->kbdev;
- struct kbasep_kctx_list_element *element;
+ struct kbasep_kctx_list_element *element = NULL;
unsigned long flags;
bool enable_backend = false;
int err;
@@ -385,11 +385,8 @@ static int kbasep_vinstr_create_kctx(struct kbase_vinstr_context *vinstr_ctx)
/* Map the master kernel dump buffer. The HW dumps the counters
* into this memory region. */
err = kbasep_vinstr_map_kernel_dump_buffer(vinstr_ctx);
- if (err) {
- kbase_destroy_context(vinstr_ctx->kctx);
- vinstr_ctx->kctx = NULL;
- return err;
- }
+ if (err)
+ goto failed_map;
/* Add kernel context to list of contexts associated with device. */
element = kzalloc(sizeof(*element), GFP_KERNEL);
@@ -403,7 +400,7 @@ static int kbasep_vinstr_create_kctx(struct kbase_vinstr_context *vinstr_ctx)
* being created in both body and summary stream. */
KBASE_TLSTREAM_TL_NEW_CTX(
vinstr_ctx->kctx,
- (u32)(vinstr_ctx->kctx->id),
+ vinstr_ctx->kctx->id,
(u32)(vinstr_ctx->kctx->tgid));
mutex_unlock(&kbdev->kctx_list_lock);
@@ -423,41 +420,38 @@ static int kbasep_vinstr_create_kctx(struct kbase_vinstr_context *vinstr_ctx)
spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
if (enable_backend)
err = enable_hwcnt(vinstr_ctx);
-
- if (err) {
- kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx);
- kbase_destroy_context(vinstr_ctx->kctx);
- if (element) {
- mutex_lock(&kbdev->kctx_list_lock);
- list_del(&element->link);
- kfree(element);
- mutex_unlock(&kbdev->kctx_list_lock);
- }
- KBASE_TLSTREAM_TL_DEL_CTX(vinstr_ctx->kctx);
- vinstr_ctx->kctx = NULL;
- return err;
- }
+ if (err)
+ goto failed_enable;
vinstr_ctx->thread = kthread_run(
kbasep_vinstr_service_task,
vinstr_ctx,
"mali_vinstr_service");
if (IS_ERR(vinstr_ctx->thread)) {
- disable_hwcnt(vinstr_ctx);
- kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx);
- kbase_destroy_context(vinstr_ctx->kctx);
- if (element) {
- mutex_lock(&kbdev->kctx_list_lock);
- list_del(&element->link);
- kfree(element);
- mutex_unlock(&kbdev->kctx_list_lock);
- }
- KBASE_TLSTREAM_TL_DEL_CTX(vinstr_ctx->kctx);
- vinstr_ctx->kctx = NULL;
- return -EFAULT;
+ err = PTR_ERR(vinstr_ctx->thread);
+ goto failed_kthread;
}
return 0;
+
+failed_kthread:
+ disable_hwcnt(vinstr_ctx);
+failed_enable:
+ spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
+ vinstr_ctx->clients_present = false;
+ spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
+ kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx);
+ if (element) {
+ mutex_lock(&kbdev->kctx_list_lock);
+ list_del(&element->link);
+ kfree(element);
+ mutex_unlock(&kbdev->kctx_list_lock);
+ KBASE_TLSTREAM_TL_DEL_CTX(vinstr_ctx->kctx);
+ }
+failed_map:
+ kbase_destroy_context(vinstr_ctx->kctx);
+ vinstr_ctx->kctx = NULL;
+ return err;
}
/**
@@ -476,7 +470,6 @@ static void kbasep_vinstr_destroy_kctx(struct kbase_vinstr_context *vinstr_ctx)
vinstr_ctx->thread = NULL;
disable_hwcnt(vinstr_ctx);
kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx);
- kbase_destroy_context(vinstr_ctx->kctx);
/* Simplify state transitions by specifying that we have no clients. */
spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
@@ -497,6 +490,9 @@ static void kbasep_vinstr_destroy_kctx(struct kbase_vinstr_context *vinstr_ctx)
if (!found)
dev_warn(kbdev->dev, "kctx not in kctx_list\n");
+ /* Destroy context. */
+ kbase_destroy_context(vinstr_ctx->kctx);
+
/* Inform timeline client about context destruction. */
KBASE_TLSTREAM_TL_DEL_CTX(vinstr_ctx->kctx);