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 fe676929a9
("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>
This commit is contained in:
parent
569fef54de
commit
e6a18bb617
1 changed files with 12 additions and 2 deletions
|
@ -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];
|
||||
|
|
Loading…
Add table
Reference in a new issue