Merge tag 'iommu-updates-v3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/joro...
[deliverable/linux.git] / drivers / iommu / intel-iommu.c
index f7fd3d0aeb4ca55bc2130a76c76e0adae4de28fc..c2c07a4a7f21c5f57d9eca2884933dd99088b60a 100644 (file)
@@ -1827,10 +1827,17 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
                        if (!pte)
                                return -ENOMEM;
                        /* It is large page*/
-                       if (largepage_lvl > 1)
+                       if (largepage_lvl > 1) {
                                pteval |= DMA_PTE_LARGE_PAGE;
-                       else
+                               /* Ensure that old small page tables are removed to make room
+                                  for superpage, if they exist. */
+                               dma_pte_clear_range(domain, iov_pfn,
+                                                   iov_pfn + lvl_to_nr_pages(largepage_lvl) - 1);
+                               dma_pte_free_pagetable(domain, iov_pfn,
+                                                      iov_pfn + lvl_to_nr_pages(largepage_lvl) - 1);
+                       } else {
                                pteval &= ~(uint64_t)DMA_PTE_LARGE_PAGE;
+                       }
 
                }
                /* We don't need lock here, nobody else
This page took 0.024795 seconds and 5 git commands to generate.