summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrakash Gupta <guptap@codeaurora.org>2017-09-18 14:34:11 +0530
committerPrakash Gupta <guptap@codeaurora.org>2017-09-20 11:04:47 +0530
commite6a18bb617e4b9714fc3e7e110ff8fa638433936 (patch)
treebb66d893b1f6b5174d3a1355ad09fe978259a6dc
parent569fef54de0bced23f057bd8146b5e5c0c9ed36f (diff)
iommu: free io pgtable during domain detach.
Pagetable pgd is allocated in arm_smmu_init_domain_context and is freed in arm_smmu_domain_free. Client can attach/detach domain without freeing the same. This causes memory leak. This was introduced with commit fe676929a960 ("iommu/arm-smmu: fix a DOMAIN_ATTR_DYNAMIC memory leak") Free io pgtables in arm_smmu_destroy_domain_context, which is invoked at the time of domain detach. Change-Id: Ib53e4efdd8dca33437596f3f0ccaa8ccaae79ca0 Signed-off-by: Prakash Gupta <guptap@codeaurora.org>
-rw-r--r--drivers/iommu/arm-smmu.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index b30739de79e7..62230d30d101 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1956,10 +1956,20 @@ static void arm_smmu_destroy_domain_context(struct iommu_domain *domain)
cb_base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
writel_relaxed(0, cb_base + ARM_SMMU_CB_SCTLR);
- arm_smmu_tlb_inv_context(smmu_domain);
-
arm_smmu_disable_clocks(smmu_domain->smmu);
+ if (smmu_domain->pgtbl_ops) {
+ free_io_pgtable_ops(smmu_domain->pgtbl_ops);
+ /* unassign any freed page table memory */
+ if (arm_smmu_is_master_side_secure(smmu_domain)) {
+ arm_smmu_secure_domain_lock(smmu_domain);
+ arm_smmu_secure_pool_destroy(smmu_domain);
+ arm_smmu_unassign_table(smmu_domain);
+ arm_smmu_secure_domain_unlock(smmu_domain);
+ }
+ smmu_domain->pgtbl_ops = NULL;
+ }
+
free_irqs:
if (cfg->irptndx != INVALID_IRPTNDX) {
irq = smmu->irqs[smmu->num_global_irqs + cfg->irptndx];