• Joerg Roedel's avatar
    iommu: Introduce Interface for IOMMU TLB Flushing · add02cfd
    Joerg Roedel authored
    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: default avatarJoerg Roedel <jroedel@suse.de>
    add02cfd
iommu.c 48.7 KB