Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iommu: Ensure .iotlb_sync is called correctly

Many drivers have no reason to use the iotlb_gather mechanism, but do
still depend on .iotlb_sync being called to properly complete an unmap.
Since the core code is now relying on the gather to detect when there
is legitimately something to sync, it should also take care of encoding
a successful unmap when the driver does not touch the gather itself.

Fixes: 90c5def10bea ("iommu: Do not call drivers for empty gathers")
Reported-by: Jon Hunter <jonathanh@nvidia.com>
Closes: https://lore.kernel.org/r/8800a38b-8515-4bbe-af15-0dae81274bf7@nvidia.com
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Tested-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Will Deacon <will@kernel.org>

authored by

Robin Murphy and committed by
Will Deacon
7e054852 8b72aa57

+6
+6
drivers/iommu/iommu.c
··· 2717 2717 2718 2718 pr_debug("unmapped: iova 0x%lx size 0x%zx\n", 2719 2719 iova, unmapped_page); 2720 + /* 2721 + * If the driver itself isn't using the gather, make sure 2722 + * it looks non-empty so iotlb_sync will still be called. 2723 + */ 2724 + if (iotlb_gather->start >= iotlb_gather->end) 2725 + iommu_iotlb_gather_add_range(iotlb_gather, iova, size); 2720 2726 2721 2727 iova += unmapped_page; 2722 2728 unmapped += unmapped_page;