summaryrefslogtreecommitdiff
path: root/mali_kbase/context/mali_kbase_context.c
diff options
context:
space:
mode:
Diffstat (limited to 'mali_kbase/context/mali_kbase_context.c')
-rw-r--r--mali_kbase/context/mali_kbase_context.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/mali_kbase/context/mali_kbase_context.c b/mali_kbase/context/mali_kbase_context.c
index 8787a56..7dece16 100644
--- a/mali_kbase/context/mali_kbase_context.c
+++ b/mali_kbase/context/mali_kbase_context.c
@@ -182,7 +182,6 @@ int kbase_context_common_init(struct kbase_context *kctx)
/* creating a context is considered a disjoint event */
kbase_disjoint_event(kctx->kbdev);
- spin_lock_init(&kctx->mm_update_lock);
kctx->process_mm = NULL;
kctx->task = NULL;
atomic_set(&kctx->nonmapped_pages, 0);
@@ -223,6 +222,13 @@ int kbase_context_common_init(struct kbase_context *kctx)
if (unlikely(err))
return err;
+
+ /* This merely takes a reference on the mm_struct and not on the
+ * address space and so won't block the freeing of address space
+ * on process exit.
+ */
+ mmgrab(current->mm);
+ kctx->process_mm = current->mm;
}
atomic_set(&kctx->used_pages, 0);
@@ -256,14 +262,18 @@ int kbase_context_common_init(struct kbase_context *kctx)
mutex_lock(&kctx->kbdev->kctx_list_lock);
err = kbase_insert_kctx_to_process(kctx);
- mutex_unlock(&kctx->kbdev->kctx_list_lock);
+
if (err) {
dev_err(kctx->kbdev->dev,
"(err:%d) failed to insert kctx to kbase_process", err);
- if (likely(kctx->filp))
+ if (likely(kctx->filp)) {
put_task_struct(kctx->task);
+ mmdrop(kctx->process_mm);
+ }
}
+ mutex_unlock(&kctx->kbdev->kctx_list_lock);
+
return err;
}
@@ -350,8 +360,10 @@ void kbase_context_common_term(struct kbase_context *kctx)
kbase_remove_kctx_from_process(kctx);
mutex_unlock(&kctx->kbdev->kctx_list_lock);
- if (likely(kctx->filp))
+ if (likely(kctx->filp)) {
put_task_struct(kctx->task);
+ mmdrop(kctx->process_mm);
+ }
KBASE_KTRACE_ADD(kctx->kbdev, CORE_CTX_DESTROY, kctx, 0u);
}