summaryrefslogtreecommitdiff
path: root/drivers/gpu/msm/kgsl_sharedmem.c
diff options
context:
space:
mode:
authorHarshdeep Dhatt <hdhatt@codeaurora.org>2016-09-16 11:02:37 -0600
committerHarshdeep Dhatt <hdhatt@codeaurora.org>2016-09-29 14:40:50 -0600
commit3f25aa2b782aef42da07fd54a89b9c3e729cc6bf (patch)
treec0c1a7028f8b60f68aa6b30a62ad2fe4364bb670 /drivers/gpu/msm/kgsl_sharedmem.c
parent626caf4e54864d90e8d104277f9a1446e487c7e1 (diff)
msm: kgsl: Do not free gpuaddr range if unmap fails
Currently, we free up the gpuaddr range whether unmap succeeds or fails. If it fails and we free up the gpuaddr range, there is a possibility that a later allocation will overlap with this range. Mapping this new range leads to a BUG_ON() in the iommu driver which thinks that we are overwriting an existing mapping. To avoid this, we never free the failing gpuaddr range, effectively removing it from being re-used for any future mappings. CRs-Fixed: 1072834 Change-Id: I57dfd6abe6c928dbe4df1bcc682d4093040ccb9f Signed-off-by: Harshdeep Dhatt <hdhatt@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm/kgsl_sharedmem.c')
-rw-r--r--drivers/gpu/msm/kgsl_sharedmem.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c
index 73edc3f7e146..72895c18119f 100644
--- a/drivers/gpu/msm/kgsl_sharedmem.c
+++ b/drivers/gpu/msm/kgsl_sharedmem.c
@@ -807,8 +807,16 @@ void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc)
return;
if (memdesc->gpuaddr) {
- kgsl_mmu_unmap(memdesc->pagetable, memdesc);
- kgsl_mmu_put_gpuaddr(memdesc->pagetable, memdesc);
+ int ret = 0;
+
+ ret = kgsl_mmu_unmap(memdesc->pagetable, memdesc);
+ /*
+ * Do not free the gpuaddr/size if unmap fails. Because if we
+ * try to map this range in future, the iommu driver will throw
+ * a BUG_ON() because it feels we are overwriting a mapping.
+ */
+ if (ret == 0)
+ kgsl_mmu_put_gpuaddr(memdesc->pagetable, memdesc);
}
if (memdesc->ops && memdesc->ops->free)