summaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorDavid Woodhouse <David.Woodhouse@intel.com>2009-07-02 13:02:34 +0200
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-07-02 13:02:38 +0200
commit6a43e574c5af7d9bd084992b1c9c3cdbc3b6c0e9 (patch)
tree64f32c60749008747d201b7168b33e1181682bf2 /drivers/pci
parentintel-iommu: Introduce first_pte_in_page() to simplify PTE-setting loops (diff)
downloadlinux-6a43e574c5af7d9bd084992b1c9c3cdbc3b6c0e9.tar.xz
linux-6a43e574c5af7d9bd084992b1c9c3cdbc3b6c0e9.zip
intel-iommu: Don't keep freeing page zero in dma_pte_free_pagetable()
Check dma_pte_present() and only free the page if there _is_ one. Kind of surprising that there was no warning about this. Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/intel-iommu.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index dcf0295a9b60..53075424a434 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -826,8 +826,10 @@ static void dma_pte_free_pagetable(struct dmar_domain *domain,
continue;
}
do {
- free_pgtable_page(phys_to_virt(dma_pte_addr(pte)));
- dma_clear_pte(pte);
+ if (dma_pte_present(pte)) {
+ free_pgtable_page(phys_to_virt(dma_pte_addr(pte)));
+ dma_clear_pte(pte);
+ }
pte++;
tmp += level_size(level);
} while (!first_pte_in_page(pte) &&