diff options
Diffstat (limited to 'mali_kbase/context/mali_kbase_context.c')
-rw-r--r-- | mali_kbase/context/mali_kbase_context.c | 20 |
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); } |