[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20241022095017.479081-3-zhenzhong.duan@intel.com>
Date: Tue, 22 Oct 2024 17:50:17 +0800
From: Zhenzhong Duan <zhenzhong.duan@...el.com>
To: iommu@...ts.linux.dev,
linux-kernel@...r.kernel.org
Cc: dwmw2@...radead.org,
baolu.lu@...ux.intel.com,
joro@...tes.org,
will@...nel.org,
robin.murphy@....com,
chao.p.peng@...el.com,
Zhenzhong Duan <zhenzhong.duan@...el.com>,
Kyung Min Park <kyung.min.park@...el.com>
Subject: [PATCH 2/2] iommu/vt-d: Fix checks in pgtable_walk()
It's not accurate to dump super page as non-present page,
meanwhile bit7 in first level page table entry is PAT bit,
also pointer pte is never NULL in pgtable_walk() context.
Fixes: 914ff7719e8a ("iommu/vt-d: Dump DMAR translation structure when DMA fault occurs")
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@...el.com>
---
drivers/iommu/intel/iommu.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 8288b0ee7a61..fec5cc1147f3 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -707,14 +707,14 @@ static void pgtable_walk(struct intel_iommu *iommu, unsigned long pfn,
while (1) {
offset = pfn_level_offset(pfn, level);
pte = &parent[offset];
- if (!pte || (dma_pte_superpage(pte) || !dma_pte_present(pte))) {
+ if (!dma_pte_present(pte)) {
pr_info("PTE not present at level %d\n", level);
break;
}
pr_info("pte level: %d, pte value: 0x%016llx\n", level, pte->val);
- if (level == 1)
+ if (level == 1 || dma_pte_superpage(pte))
break;
parent = phys_to_virt(dma_pte_addr(pte));
--
2.34.1
Powered by blists - more mailing lists