[RFC][PATCH] Fix superpage unmap on Intel IOMMU

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Tell me it isn't so...

diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index 59f17ac..6c588ee 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -3866,6 +3866,20 @@ static int intel_iommu_unmap(struct iommu_domain *domain,
 	struct dmar_domain *dmar_domain = domain->priv;
 	size_t size = PAGE_SIZE << gfp_order;
 
+	/* The KVM code is *fucked* in the head. It maps the range
+	   one page at a time, using 4KiB pages unless it actually
+	   allocated hugepages using hugetlbfs. (So we get to flush
+	   the CPU data cache and then the IOTLB for each page in
+	   its loop). And on unmap, it unmaps 4KiB at a time (always
+	   passing gfp_order==0), regardless of whether it mapped
+	   using superpages or not. So on unmap, if we detect a
+	   superpage in our page tables we are expected to unmap
+	   *more* than we are asked to, and return a value indicating
+	   how much we actually unmapped. WTF? */
+	if (dma_pfn_level_pte (dmar_domain, iova >> VTD_PAGE_SHIFT,
+			       1, &gfp_order))
+		size = PAGE_SIZE << gfp_order;
+	    
 	dma_pte_clear_range(dmar_domain, iova >> VTD_PAGE_SHIFT,
 			    (iova + size - 1) >> VTD_PAGE_SHIFT);
 

-- 
David Woodhouse                            Open Source Technology Centre
David.Woodhouse@xxxxxxxxx                              Intel Corporation

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux