summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSheng Yang <sheng@linux.intel.com>2010-06-12 19:21:42 +0800
committerDavid Woodhouse <David.Woodhouse@intel.com>2010-06-15 10:40:02 +0100
commit25cbff1660d3f4c059a178a1e5b851be6d70c5e8 (patch)
treeb0f43789d01fcb89041195550a582a41dfb979d7
parent7e27d6e778cd87b6f2415515d7127eba53fe5d02 (diff)
downloadlinux-3.10-25cbff1660d3f4c059a178a1e5b851be6d70c5e8.tar.gz
linux-3.10-25cbff1660d3f4c059a178a1e5b851be6d70c5e8.tar.bz2
linux-3.10-25cbff1660d3f4c059a178a1e5b851be6d70c5e8.zip
intel-iommu: Fix reference by physical address in intel_iommu_attach_device()
Commit a99c47a2 "intel-iommu: errors with smaller iommu widths" replace the dmar_domain->pgd with the first entry of page table when iommu's supported width is smaller than dmar_domain's. But it use physical address directly for new dmar_domain->pgd... This result in KVM oops with VT-d on some machines. Reported-by: Allen Kay <allen.m.kay@intel.com> Cc: Tom Lyon <pugs@cisco.com> Signed-off-by: Sheng Yang <sheng@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--drivers/pci/intel-iommu.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index 796828fce34..3bd30557ce2 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -3603,7 +3603,8 @@ static int intel_iommu_attach_device(struct iommu_domain *domain,
pte = dmar_domain->pgd;
if (dma_pte_present(pte)) {
free_pgtable_page(dmar_domain->pgd);
- dmar_domain->pgd = (struct dma_pte *)dma_pte_addr(pte);
+ dmar_domain->pgd = (struct dma_pte *)
+ phys_to_virt(dma_pte_addr(pte));
}
dmar_domain->agaw--;
}