diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 49b5d3115e56..6a88ba9321d1 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -1460,10 +1460,13 @@ static u64 *alloc_pte(struct protection_domain *domain, while (level > end_lvl) { u64 __pte, __npte; + int pte_level; - __pte = *pte; + __pte = *pte; + pte_level = PM_PTE_LEVEL(__pte); - if (!IOMMU_PTE_PRESENT(__pte)) { + if (!IOMMU_PTE_PRESENT(__pte) || + pte_level == PAGE_MODE_7_LEVEL) { page = (u64 *)get_zeroed_page(gfp); if (!page) return NULL; @@ -1475,10 +1478,13 @@ static u64 *alloc_pte(struct protection_domain *domain, free_page((unsigned long)page); continue; } + + if (pte_level == PAGE_MODE_7_LEVEL) + domain->updated = true; } /* No level skipping support yet */ - if (PM_PTE_LEVEL(*pte) != level) + if (pte_level != level) return NULL; level -= 1;