iommu/vt-d: fix range computation when making room for large pages
authorChristian Zander <christian@nervanasys.com>
Wed, 10 Jun 2015 16:41:45 +0000 (09:41 -0700)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Tue, 13 Oct 2015 19:32:50 +0000 (20:32 +0100)
commitba2374fd2bf379f933773811fdb06cb6a5445f41
treee83db63bf1e80915c394116e3286510a9683fd49
parent049e6dde7e57f0054fdc49102e7ef4830c698b46
iommu/vt-d: fix range computation when making room for large pages

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).

Cc: stable@vger.kernel.org
Signed-off-by: Christian Zander <christian@nervanasys.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/iommu/intel-iommu.c