• Christian Zander's avatar
    iommu/vt-d: fix range computation when making room for large pages · cca53289
    Christian Zander authored
    commit ba2374fd upstream.
    
    In preparation for the installation of a large page, any small page
    tables that may still exist in the target IOV address range are
    removed.  However, if a scatter/gather list entry is large enough to
    fit more than one large page, the address space for any subsequent
    large pages is not cleared of conflicting small page tables.
    
    This can cause legitimate mapping requests to fail with errors of the
    form below, potentially followed by a series of IOMMU faults:
    
    ERROR: DMA PTE for vPFN 0xfde00 already set (to 7f83a4003 not 7e9e00083)
    
    In this example, a 4MiB scatter/gather list entry resulted in the
    successful installation of a large page @ vPFN 0xfdc00, followed by
    a failed attempt to install another large page @ vPFN 0xfde00, due to
    the presence of a pointer to a small page table @ 0x7f83a4000.
    
    To address this problem, compute the number of large pages that fit
    into a given scatter/gather list entry, and use it to derive the
    last vPFN covered by the large page(s).
    Signed-off-by: default avatarChristian Zander <christian@nervanasys.com>
    Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
    [bwh: Backported to 3.2:
     - Add the lvl_pages variable, added by an earlier commit upstream
     - Also change arguments to dma_pte_clear_range(), which is called by
       dma_pte_free_pagetable() upstream]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    cca53289
intel-iommu.c 107 KB