summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_mem.c
diff options
context:
space:
mode:
authorSidath Senanayake <sidaths@google.com>2019-11-11 11:49:32 +0100
committerSidath Senanayake <sidaths@google.com>2020-08-14 16:22:18 +0100
commit1f3b3ea0d31f66a6ec806e8f6ac5ebee44cb5923 (patch)
treef3e70f0e481dbd28087fca3b36a751d5fbe82521 /mali_kbase/mali_kbase_mem.c
parent869660680efaed77cec0414161640a6f1a85d5b2 (diff)
downloadgpu-1f3b3ea0d31f66a6ec806e8f6ac5ebee44cb5923.tar.gz
Mali Valhall DDK r21p0 KMD
Provenance: 055b0c4d8 (collaborate/EAC/v_r21p0) VX504X08X-BU-00000-r21p0-01rel0 - Android DDK Signed-off-by: Sidath Senanayake <sidaths@google.com> Change-Id: I652de1257c48ecb047f160906039e843347a7cd7
Diffstat (limited to 'mali_kbase/mali_kbase_mem.c')
-rw-r--r--mali_kbase/mali_kbase_mem.c84
1 files changed, 61 insertions, 23 deletions
diff --git a/mali_kbase/mali_kbase_mem.c b/mali_kbase/mali_kbase_mem.c
index fa05f34..4589983 100644
--- a/mali_kbase/mali_kbase_mem.c
+++ b/mali_kbase/mali_kbase_mem.c
@@ -970,6 +970,9 @@ int kbase_mem_init(struct kbase_device *kbdev)
"Failed to get memory group manger module\n");
err = -ENODEV;
kbdev->mgm_dev = NULL;
+ } else {
+ dev_info(kbdev->dev,
+ "Memory group manager successfully loaded\n");
}
}
of_node_put(mgm_node);
@@ -1154,7 +1157,7 @@ void kbase_free_alloced_region(struct kbase_va_region *reg)
* Remove the region from the sticky resource metadata
* list should it be there.
*/
- kbase_sticky_resource_release(kctx, NULL,
+ kbase_sticky_resource_release_force(kctx, NULL,
reg->start_pfn << PAGE_SHIFT);
kbase_mem_phy_alloc_put(reg->cpu_alloc);
@@ -1715,7 +1718,7 @@ int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr)
/* ask to unlink the cookie as we'll free it */
kctx->pending_regions[cookie] = NULL;
- kctx->cookies |= (1UL << cookie);
+ bitmap_set(kctx->cookies, cookie, 1);
kbase_free_alloced_region(reg);
} else {
@@ -3795,6 +3798,7 @@ struct kbase_ctx_ext_res_meta *kbase_sticky_resource_acquire(
list_for_each_entry(walker, &kctx->ext_res_meta_head, ext_res_node) {
if (walker->gpu_addr == gpu_addr) {
meta = walker;
+ meta->ref++;
break;
}
}
@@ -3819,6 +3823,7 @@ struct kbase_ctx_ext_res_meta *kbase_sticky_resource_acquire(
* for the physical resource.
*/
meta->alloc = kbase_map_external_resource(kctx, reg, NULL);
+ meta->ref = 1;
if (!meta->alloc)
goto fail_map;
@@ -3836,32 +3841,28 @@ failed:
return NULL;
}
-bool kbase_sticky_resource_release(struct kbase_context *kctx,
- struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr)
+static struct kbase_ctx_ext_res_meta *
+find_sticky_resource_meta(struct kbase_context *kctx, u64 gpu_addr)
{
struct kbase_ctx_ext_res_meta *walker;
- struct kbase_va_region *reg;
lockdep_assert_held(&kctx->reg_lock);
- /* Search of the metadata if one isn't provided. */
- if (!meta) {
- /*
- * Walk the per context external resource metadata list for the
- * metadata which matches the region which is being released.
- */
- list_for_each_entry(walker, &kctx->ext_res_meta_head,
- ext_res_node) {
- if (walker->gpu_addr == gpu_addr) {
- meta = walker;
- break;
- }
- }
- }
+ /*
+ * Walk the per context external resource metadata list for the
+ * metadata which matches the region which is being released.
+ */
+ list_for_each_entry(walker, &kctx->ext_res_meta_head, ext_res_node)
+ if (walker->gpu_addr == gpu_addr)
+ return walker;
- /* No metadata so just return. */
- if (!meta)
- return false;
+ return NULL;
+}
+
+static void release_sticky_resource_meta(struct kbase_context *kctx,
+ struct kbase_ctx_ext_res_meta *meta)
+{
+ struct kbase_va_region *reg;
/* Drop the physical memory reference and free the metadata. */
reg = kbase_region_tracker_find_region_enclosing_address(
@@ -3871,6 +3872,43 @@ bool kbase_sticky_resource_release(struct kbase_context *kctx,
kbase_unmap_external_resource(kctx, reg, meta->alloc);
list_del(&meta->ext_res_node);
kfree(meta);
+}
+
+bool kbase_sticky_resource_release(struct kbase_context *kctx,
+ struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr)
+{
+ lockdep_assert_held(&kctx->reg_lock);
+
+ /* Search of the metadata if one isn't provided. */
+ if (!meta)
+ meta = find_sticky_resource_meta(kctx, gpu_addr);
+
+ /* No metadata so just return. */
+ if (!meta)
+ return false;
+
+ if (--meta->ref != 0)
+ return true;
+
+ release_sticky_resource_meta(kctx, meta);
+
+ return true;
+}
+
+bool kbase_sticky_resource_release_force(struct kbase_context *kctx,
+ struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr)
+{
+ lockdep_assert_held(&kctx->reg_lock);
+
+ /* Search of the metadata if one isn't provided. */
+ if (!meta)
+ meta = find_sticky_resource_meta(kctx, gpu_addr);
+
+ /* No metadata so just return. */
+ if (!meta)
+ return false;
+
+ release_sticky_resource_meta(kctx, meta);
return true;
}
@@ -3901,6 +3939,6 @@ void kbase_sticky_resource_term(struct kbase_context *kctx)
walker = list_first_entry(&kctx->ext_res_meta_head,
struct kbase_ctx_ext_res_meta, ext_res_node);
- kbase_sticky_resource_release(kctx, walker, 0);
+ kbase_sticky_resource_release_force(kctx, walker, 0);
}
}