diff options
| author | David Woodhouse <David.Woodhouse@intel.com> | 2009-07-02 07:02:34 -0400 |
|---|---|---|
| committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-07-02 07:02:38 -0400 |
| commit | 6a43e574c5af7d9bd084992b1c9c3cdbc3b6c0e9 (patch) | |
| tree | 64f32c60749008747d201b7168b33e1181682bf2 | |
| parent | 75e6bf9638992dfc0fec9c3ca10444c8e0d6a638 (diff) | |
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>
| -rw-r--r-- | drivers/pci/intel-iommu.c | 6 |
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, | |||
| 826 | continue; | 826 | continue; |
| 827 | } | 827 | } |
| 828 | do { | 828 | do { |
| 829 | free_pgtable_page(phys_to_virt(dma_pte_addr(pte))); | 829 | if (dma_pte_present(pte)) { |
| 830 | dma_clear_pte(pte); | 830 | free_pgtable_page(phys_to_virt(dma_pte_addr(pte))); |
| 831 | dma_clear_pte(pte); | ||
| 832 | } | ||
| 831 | pte++; | 833 | pte++; |
| 832 | tmp += level_size(level); | 834 | tmp += level_size(level); |
| 833 | } while (!first_pte_in_page(pte) && | 835 | } while (!first_pte_in_page(pte) && |
