diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-27 19:51:17 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-29 08:31:12 -0400 |
commit | 163cc52ccd2cc5c5ae4e1c886f6fde8547feed2a (patch) | |
tree | 0371640770d8c575779b29cfaea2b27e922ce724 /drivers/pci | |
parent | d794dc9b302c2781c571c10dedb8094e223d31b8 (diff) |
intel-iommu: Clean up intel_iommu_unmap_range()
Use unaligned address for domain->max_addr. That algorithm isn't ideal
anyway -- we should probably just look at the last iova in the tree.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/intel-iommu.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index fc593adb049a..21dc77311863 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -3491,7 +3491,7 @@ static int intel_iommu_map_range(struct iommu_domain *domain, | |||
3491 | if ((iommu_prot & IOMMU_CACHE) && dmar_domain->iommu_snooping) | 3491 | if ((iommu_prot & IOMMU_CACHE) && dmar_domain->iommu_snooping) |
3492 | prot |= DMA_PTE_SNP; | 3492 | prot |= DMA_PTE_SNP; |
3493 | 3493 | ||
3494 | max_addr = (iova & VTD_PAGE_MASK) + VTD_PAGE_ALIGN(size); | 3494 | max_addr = iova + size; |
3495 | if (dmar_domain->max_addr < max_addr) { | 3495 | if (dmar_domain->max_addr < max_addr) { |
3496 | int min_agaw; | 3496 | int min_agaw; |
3497 | u64 end; | 3497 | u64 end; |
@@ -3518,16 +3518,12 @@ static void intel_iommu_unmap_range(struct iommu_domain *domain, | |||
3518 | unsigned long iova, size_t size) | 3518 | unsigned long iova, size_t size) |
3519 | { | 3519 | { |
3520 | struct dmar_domain *dmar_domain = domain->priv; | 3520 | struct dmar_domain *dmar_domain = domain->priv; |
3521 | dma_addr_t base; | ||
3522 | 3521 | ||
3523 | /* The address might not be aligned */ | 3522 | dma_pte_clear_range(dmar_domain, iova >> VTD_PAGE_SHIFT, |
3524 | base = iova & VTD_PAGE_MASK; | 3523 | (iova + size - 1) >> VTD_PAGE_SHIFT); |
3525 | size = VTD_PAGE_ALIGN(size); | ||
3526 | dma_pte_clear_range(dmar_domain, base >> VTD_PAGE_SHIFT, | ||
3527 | (base + size - 1) >> VTD_PAGE_SHIFT); | ||
3528 | 3524 | ||
3529 | if (dmar_domain->max_addr == base + size) | 3525 | if (dmar_domain->max_addr == iova + size) |
3530 | dmar_domain->max_addr = base; | 3526 | dmar_domain->max_addr = iova; |
3531 | } | 3527 | } |
3532 | 3528 | ||
3533 | static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, | 3529 | static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, |