summaryrefslogtreecommitdiffstats
path: root/vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@fedoraproject.org>2013-10-09 09:01:38 -0400
committerJosh Boyer <jwboyer@fedoraproject.org>2013-10-09 09:01:38 -0400
commit0713af68c631dd1df5715a813a8571c2fb470353 (patch)
tree9307659412b7c967e77990007c35a623666b1cee /vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch
parent874c607aa22b0e75adf0e6ace71d997b261e7268 (diff)
downloadkernel-0713af68c631dd1df5715a813a8571c2fb470353.tar.gz
kernel-0713af68c631dd1df5715a813a8571c2fb470353.tar.xz
kernel-0713af68c631dd1df5715a813a8571c2fb470353.zip
Add patch to fix VFIO IOMMU crash (rhbz 998732)
Diffstat (limited to 'vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch')
-rw-r--r--vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch39
1 files changed, 39 insertions, 0 deletions
diff --git a/vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch b/vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch
new file mode 100644
index 000000000..0b5fa8a7a
--- /dev/null
+++ b/vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch
@@ -0,0 +1,39 @@
+From: Julian Stecklina <jsteckli@os.info.tu-dresden.de>
+Subject: [PATCH] vfio, iommu: Fixed interaction of VFIO_IOMMU_MAP_DMA with IOMMU address limits
+
+The BUG_ON in drivers/iommu/intel-iommu.c:785 can be triggered from userspace via
+VFIO by calling the VFIO_IOMMU_MAP_DMA ioctl on a vfio device with any address
+beyond the addressing capabilities of the IOMMU. The problem is that the ioctl code
+calls iommu_iova_to_phys before it calls iommu_map. iommu_map handles the case that
+it gets addresses beyond the addressing capabilities of its IOMMU.
+intel_iommu_iova_to_phys does not.
+
+This patch fixes iommu_iova_to_phys to return NULL for addresses beyond what the
+IOMMU can handle. This in turn causes the ioctl call to fail in iommu_map and
+(correctly) return EFAULT to the user with a helpful warning message in the kernel
+log.
+
+Signed-off-by: Julian Stecklina <jsteckli@os.inf.tu-dresden.de>
+---
+ drivers/iommu/intel-iommu.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
+index eec0d3e..61303db 100644
+--- a/drivers/iommu/intel-iommu.c
++++ b/drivers/iommu/intel-iommu.c
+@@ -782,7 +782,11 @@ static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain,
+ int offset;
+
+ BUG_ON(!domain->pgd);
+- BUG_ON(addr_width < BITS_PER_LONG && pfn >> addr_width);
++
++ if (addr_width < BITS_PER_LONG && pfn >> addr_width)
++ /* Address beyond IOMMU's addressing capabilities. */
++ return NULL;
++
+ parent = domain->pgd;
+
+ while (level > 0) {
+--
+1.8.3.1