iommu: Introduce Interface for IOMMU TLB Flushing
authorJoerg Roedel <jroedel@suse.de>
Wed, 23 Aug 2017 13:50:04 +0000 (15:50 +0200)
committerJoerg Roedel <jroedel@suse.de>
Wed, 30 Aug 2017 16:07:13 +0000 (18:07 +0200)
commitadd02cfdc9bc2987b0121861d5bb0c7392865be9
treecb6fac974f4197968af1346bc13d6fce9f461cf7
parent0688a09990986cd8c2fda26afb04ce0a599ced3f
iommu: Introduce Interface for IOMMU TLB Flushing

With the current IOMMU-API the hardware TLBs have to be
flushed in every iommu_ops->unmap() call-back.

For unmapping large amounts of address space, like it
happens when a KVM domain with assigned devices is
destroyed, this causes thousands of unnecessary TLB flushes
in the IOMMU hardware because the unmap call-back runs for
every unmapped physical page.

With the TLB Flush Interface and the new iommu_unmap_fast()
function introduced here the need to clean the hardware TLBs
is removed from the unmapping code-path. Users of
iommu_unmap_fast() have to explicitly call the TLB-Flush
functions to sync the page-table changes to the hardware.

Three functions for TLB-Flushes are introduced:

* iommu_flush_tlb_all() - Flushes all TLB entries
                          associated with that
  domain. TLBs entries are
  flushed when this function
  returns.

* iommu_tlb_range_add() - This will add a given
  range to the flush queue
  for this domain.

* iommu_tlb_sync() - Flushes all queued ranges from
     the hardware TLBs. Returns when
     the flush is finished.

The semantic of this interface is intentionally similar to
the iommu_gather_ops from the io-pgtable code.

Cc: Alex Williamson <alex.williamson@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c
include/linux/iommu.h