diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-29 22:38:09 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-29 22:57:38 -0400 |
commit | 3d7b0e4154b4963d6bd39991ec8eaa09caeb3994 (patch) | |
tree | 8c92261cda93b9635e7f84f218f47b2f6f68814e /drivers/pci/intel-iommu.c | |
parent | 1bf20f0dc5629032ddd07617139d9fbca66c1642 (diff) |
intel-iommu: Don't free too much in dma_pte_free_pagetable()
The loop condition was wrong -- we should free a PMD only if its
_entire_ range is within the range we're intending to clear. The
early-termination condition was right, but not the loop.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/pci/intel-iommu.c')
-rw-r--r-- | drivers/pci/intel-iommu.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 40ce5a03f18f..35bdd2a06caa 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -815,7 +815,7 @@ static void dma_pte_free_pagetable(struct dmar_domain *domain, | |||
815 | if (tmp + level_size(level) - 1 > last_pfn) | 815 | if (tmp + level_size(level) - 1 > last_pfn) |
816 | return; | 816 | return; |
817 | 817 | ||
818 | while (tmp <= last_pfn) { | 818 | while (tmp + level_size(level) - 1 <= last_pfn) { |
819 | pte = dma_pfn_level_pte(domain, tmp, level); | 819 | pte = dma_pfn_level_pte(domain, tmp, level); |
820 | if (pte) { | 820 | if (pte) { |
821 | free_pgtable_page( | 821 | free_pgtable_page( |