diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index 05d63fe92e4361..fce75ccbd6bd8b 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c @@ -666,9 +666,11 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data, /* Clear the remaining entries */ __arm_lpae_clear_pte(ptep, &iop->cfg, i); - if (gather && !iommu_iotlb_gather_queued(gather)) + if (gather && !iommu_iotlb_gather_queued(gather)) { + iommu_iotlb_gather_add_range(gather, iova, i * size); for (int j = 0; j < i; j++) io_pgtable_tlb_add_page(iop, gather, iova + j * size, size); + } return i * size; } else if (iopte_leaf(pte, lvl, iop->fmt)) { diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c index 54d287cc0dd1b8..cbef7de45d7e27 100644 --- a/drivers/iommu/io-pgtable-dart.c +++ b/drivers/iommu/io-pgtable-dart.c @@ -330,6 +330,9 @@ static size_t dart_unmap_pages(struct io_pgtable_ops *ops, unsigned long iova, i++; } + if (i && !iommu_iotlb_gather_queued(gather)) + iommu_iotlb_gather_add_range(gather, iova, i * pgsize); + return i * pgsize; } diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 60fcd3d3b5ebdf..1456535d0924ea 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -828,7 +828,6 @@ static size_t mtk_iommu_unmap(struct iommu_domain *domain, { struct mtk_iommu_domain *dom = to_mtk_domain(domain); - iommu_iotlb_gather_add_range(gather, iova, pgsize * pgcount); return dom->iop->unmap_pages(dom->iop, iova, pgsize, pgcount, gather); } diff --git a/drivers/iommu/sprd-iommu.c b/drivers/iommu/sprd-iommu.c index 555d4505c747a9..f37030f5ed172a 100644 --- a/drivers/iommu/sprd-iommu.c +++ b/drivers/iommu/sprd-iommu.c @@ -340,6 +340,7 @@ static size_t sprd_iommu_unmap(struct iommu_domain *domain, unsigned long iova, spin_lock_irqsave(&dom->pgtlock, flags); memset(pgt_base_iova, 0, pgcount * sizeof(u32)); spin_unlock_irqrestore(&dom->pgtlock, flags); + iommu_iotlb_gather_add_range(iotlb_gather, iova, size); return size; } diff --git a/drivers/iommu/sun50i-iommu.c b/drivers/iommu/sun50i-iommu.c index 90b26fe2181765..18c2658bbfed70 100644 --- a/drivers/iommu/sun50i-iommu.c +++ b/drivers/iommu/sun50i-iommu.c @@ -655,6 +655,7 @@ static size_t sun50i_iommu_unmap(struct iommu_domain *domain, unsigned long iova memset(pte_addr, 0, sizeof(*pte_addr)); sun50i_table_flush(sun50i_domain, pte_addr, 1); + iommu_iotlb_gather_add_range(gather, iova, SZ_4K); return SZ_4K; } diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c index d314fa5cd84768..bb2b2abbb87af8 100644 --- a/drivers/iommu/virtio-iommu.c +++ b/drivers/iommu/virtio-iommu.c @@ -897,6 +897,8 @@ static size_t viommu_unmap_pages(struct iommu_domain *domain, unsigned long iova if (unmapped < size) return 0; + iommu_iotlb_gather_add_range(gather, iova, unmapped); + /* Device already removed all mappings after detach. */ if (!vdomain->nr_endpoints) return unmapped;