Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27e7a6ba authored by Mitchel Humpherys's avatar Mitchel Humpherys Committed by Matt Wagantall
Browse files

iommu/arm-smmu: fix leak in arm_smmu_flush_pgtable



We're currently mapping a page in arm_smmu_flush_pgtable without ever
unmapping it.  Fix this by calling dma_unmap_page on the returned dma
address.  Since the only reason we're calling dma_map_page is to make
sure it actually gets flushed out to RAM, we can just call
dma_unmap_page immediately following the map.

Without this, eventually swiotlb runs out of memory and starts printing
things like:

    arm-smmu d00000.arm,smmu: swiotlb buffer is full (sz: 128 bytes)

Change-Id: I69421de6e2189a16cd88f225e2698cd88d669dff
Signed-off-by: default avatarMitchel Humpherys <mitchelh@codeaurora.org>
parent e491deea
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -978,13 +978,22 @@ static void arm_smmu_flush_pgtable(struct arm_smmu_domain *smmu_domain,
		 * recursion here as the SMMU table walker will not be wired
		 * through another SMMU.
		 */
		if (smmu)
		if (smmu) {
			dma_addr_t handle =
				dma_map_page(smmu->dev, virt_to_page(addr),
					offset, size, DMA_TO_DEVICE);
			if (handle == DMA_ERROR_CODE)
				dev_err(smmu->dev,
					"Couldn't flush page tables at %p!\n",
					addr);
			else
				dma_unmap_page(smmu->dev, handle, size,
					DMA_TO_DEVICE);
		} else {
			dmac_clean_range(addr, addr + size);
		}
	}
}

static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain)
{