]> git.baikalelectronics.ru Git - kernel.git/commit
iommu: Remove empty iommu_tlb_range_add() callback from iommu_ops
authorWill Deacon <will@kernel.org>
Tue, 2 Jul 2019 15:43:07 +0000 (16:43 +0100)
committerWill Deacon <will@kernel.org>
Wed, 24 Jul 2019 12:32:33 +0000 (13:32 +0100)
commit576267bc27d61084ffb8a32009b04ab9c8a8e558
tree23f7869dc3b6b51170912972a0c5fa3b92417625
parent8ae2f793d21f67d4ab95029bb6873efffa36907b
iommu: Remove empty iommu_tlb_range_add() callback from iommu_ops

Commit 436d5496070c ("iommu: Introduce Interface for IOMMU TLB Flushing")
added three new TLB flushing operations to the IOMMU API so that the
underlying driver operations can be batched when unmapping large regions
of IO virtual address space.

However, the ->iotlb_range_add() callback has not been implemented by
any IOMMU drivers (amd_iommu.c implements it as an empty function, which
incurs the overhead of an indirect branch). Instead, drivers either flush
the entire IOTLB in the ->iotlb_sync() callback or perform the necessary
invalidation during ->unmap().

Attempting to implement ->iotlb_range_add() for arm-smmu-v3.c revealed
two major issues:

  1. The page size used to map the region in the page-table is not known,
     and so it is not generally possible to issue TLB flushes in the most
     efficient manner.

  2. The only mutable state passed to the callback is a pointer to the
     iommu_domain, which can be accessed concurrently and therefore
     requires expensive synchronisation to keep track of the outstanding
     flushes.

Remove the callback entirely in preparation for extending ->unmap() and
->iotlb_sync() to update a token on the caller's stack.

Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/amd_iommu.c
drivers/iommu/iommu.c
drivers/vfio/vfio_iommu_type1.c
include/linux/iommu.h