• Jason Gunthorpe's avatar
    iommufd: PFN handling for iopt_pages · f394576e
    Jason Gunthorpe authored
    The top of the data structure provides an IO Address Space (IOAS) that is
    similar to a VFIO container. The IOAS allows map/unmap of memory into
    ranges of IOVA called iopt_areas. Multiple IOMMU domains (IO page tables)
    and in-kernel accesses (like VFIO mdevs) can be attached to the IOAS to
    access the PFNs that those IOVA areas cover.
    
    The IO Address Space (IOAS) datastructure is composed of:
     - struct io_pagetable holding the IOVA map
     - struct iopt_areas representing populated portions of IOVA
     - struct iopt_pages representing the storage of PFNs
     - struct iommu_domain representing each IO page table in the system IOMMU
     - struct iopt_pages_access representing in-kernel accesses of PFNs (ie
       VFIO mdevs)
     - struct xarray pinned_pfns holding a list of pages pinned by in-kernel
       accesses
    
    This patch introduces the lowest part of the datastructure - the movement
    of PFNs in a tiered storage scheme:
     1) iopt_pages::pinned_pfns xarray
     2) Multiple iommu_domains
     3) The origin of the PFNs, i.e. the userspace pointer
    
    PFN have to be copied between all combinations of tiers, depending on the
    configuration.
    
    The interface is an iterator called a 'pfn_reader' which determines which
    tier each PFN is stored and loads it into a list of PFNs held in a struct
    pfn_batch.
    
    Each step of the iterator will fill up the pfn_batch, then the caller can
    use the pfn_batch to send the PFNs to the required destination. Repeating
    this loop will read all the PFNs in an IOVA range.
    
    The pfn_reader and pfn_batch also keep track of the pinned page accounting.
    
    While PFNs are always stored and accessed as full PAGE_SIZE units the
    iommu_domain tier can store with a sub-page offset/length to support
    IOMMUs with a smaller IOPTE size than PAGE_SIZE.
    
    Link: https://lore.kernel.org/r/8-v6-a196d26f289e+11787-iommufd_jgg@nvidia.comReviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Tested-by: default avatarNicolin Chen <nicolinc@nvidia.com>
    Tested-by: default avatarYi Liu <yi.l.liu@intel.com>
    Tested-by: default avatarLixiao Yang <lixiao.yang@intel.com>
    Tested-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    f394576e
double_span.h 1.78 KB