• Will Deacon's avatar
    iommu: Remove empty iommu_tlb_range_add() callback from iommu_ops · 6d1bcb95
    Will Deacon authored
    Commit add02cfd ("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: default avatarWill Deacon <will@kernel.org>
    6d1bcb95
amd_iommu.c 104 KB