提交 9db034d5 编写于 作者: J Joerg Roedel

iommu/amd: Restart loop if cmpxchg64 succeeded in alloc_pte()

This makes sure that __pte always contains the correct value
when the pointer to the next page-table level is derived.
Signed-off-by: NJoerg Roedel <jroedel@suse.de>
上级 6d568ef9
......@@ -1474,13 +1474,12 @@ static u64 *alloc_pte(struct protection_domain *domain,
__npte = PM_LEVEL_PDE(level, iommu_virt_to_phys(page));
/* pte could have been changed somewhere. */
if (cmpxchg64(pte, __pte, __npte) != __pte) {
if (cmpxchg64(pte, __pte, __npte) != __pte)
free_page((unsigned long)page);
continue;
}
if (pte_level == PAGE_MODE_7_LEVEL)
else if (pte_level == PAGE_MODE_7_LEVEL)
domain->updated = true;
continue;
}
/* No level skipping support yet */
......@@ -1489,7 +1488,7 @@ static u64 *alloc_pte(struct protection_domain *domain,
level -= 1;
pte = IOMMU_PTE_PAGE(*pte);
pte = IOMMU_PTE_PAGE(__pte);
if (pte_page && level == end_lvl)
*pte_page = pte;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册