msm: kgsl: Fix mem leak when page allocation fails
Page allocation may fail during OOM condition. Update
sglen and size to correct value (allocated) so that
they get freed in kgsl_sharedmem_free().
Change-Id: I1aa0ca77bb767523dfcf0f6cc3a21eac2b6b80e4
Signed-off-by: Hareesh Gundu <hareeshg@codeaurora.org>
diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c
old mode 100755
new mode 100644
index de62c3a..2881e49
--- a/drivers/gpu/msm/kgsl_sharedmem.c
+++ b/drivers/gpu/msm/kgsl_sharedmem.c
@@ -552,7 +552,6 @@
sglen_alloc = PAGE_ALIGN(size) >> PAGE_SHIFT;
- memdesc->size = size;
memdesc->pagetable = pagetable;
memdesc->ops = &kgsl_page_alloc_ops;
@@ -615,6 +614,14 @@
continue;
}
+ /*
+ * Update sglen and memdesc size,as requested allocation
+ * not served fully. So that they can be correctly freed
+ * in kgsl_sharedmem_free().
+ */
+ memdesc->sglen = sglen;
+ memdesc->size = (size - len);
+
KGSL_CORE_ERR(
"Out of memory: only allocated %dKB of %dKB requested\n",
(size - len) >> 10, size >> 10);
@@ -631,6 +638,7 @@
}
memdesc->sglen = sglen;
+ memdesc->size = size;
/*
* All memory that goes to the user has to be zeroed out before it gets
@@ -671,15 +679,15 @@
outer_cache_range_op_sg(memdesc->sg, memdesc->sglen,
KGSL_CACHE_OP_FLUSH);
- KGSL_STATS_ADD(size, kgsl_driver.stats.page_alloc,
- kgsl_driver.stats.page_alloc_max);
-
order = get_order(size);
if (order < 16)
kgsl_driver.stats.histogram[order]++;
done:
+ KGSL_STATS_ADD(memdesc->size, kgsl_driver.stats.page_alloc,
+ kgsl_driver.stats.page_alloc_max);
+
if ((memdesc->sglen_alloc * sizeof(struct page *)) > PAGE_SIZE)
vfree(pages);
else