• Paul Durrant's avatar
    iommu: elide flushing for higher order map/unmap operations · e8afe112
    Paul Durrant authored
    This patch removes any implicit flushing that occurs in the implementation
    of map and unmap operations and adds new iommu_map/unmap() wrapper
    functions. To maintain semantics of the iommu_legacy_map/unmap() wrapper
    functions, these are modified to call the new wrapper functions and then
    perform an explicit flush operation.
    Because VT-d currently performs two different types of flush dependent upon
    whether a PTE is being modified versus merely added (i.e. replacing a non-
    present PTE) 'iommu flush flags' are defined by this patch and the
    iommu_ops map_page() and unmap_page() methods are modified to OR the type
    of flush necessary for the PTE that has been populated or depopulated into
    an accumulated flags value. The accumulated value can then be passed into
    the explicit flush operation.
    The ARM SMMU implementations of map_page() and unmap_page() currently
    perform no implicit flushing and therefore the modified methods do not
    adjust the flush flags.
    NOTE: The per-cpu 'iommu_dont_flush_iotlb' is respected by the
          iommu_legacy_map/unmap() wrapper functions and therefore this now
          applies to all IOMMU implementations rather than just VT-d.
    Signed-off-by: default avatarPaul Durrant <paul.durrant@citrix.com>
    Reviewed-by: default avatarJan Beulich <jbeulich@suse.com>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Acked-by: default avatarJulien Grall <julien.grall@arm.com>
    Acked-by: default avatarBrian Woods <brian.woods@amd.com>
iommu.c 78.5 KB