summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
authorWeidong Han <weidong.han@intel.com>2008-09-25 23:32:02 +0800
committerAvi Kivity <avi@redhat.com>2008-10-15 14:25:29 +0200
commite5fcfc821a467bd0827635db8fd39ab1213987e5 (patch)
treec0b4247f84dc8382bd1e5312aa49430499b16615 /arch/x86/kvm
parente48258009d941891fca35348986b8d280caf31cd (diff)
downloadlinux-e5fcfc821a467bd0827635db8fd39ab1213987e5.tar.bz2
KVM: Device Assignment: Map mmio pages into VT-d page table
Assigned device could DMA to mmio pages, so also need to map mmio pages into VT-d page table. Signed-off-by: Weidong Han <weidong.han@intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/vtd.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/arch/x86/kvm/vtd.c b/arch/x86/kvm/vtd.c
index 667bf3fb64bf..a770874f3a3a 100644
--- a/arch/x86/kvm/vtd.c
+++ b/arch/x86/kvm/vtd.c
@@ -36,37 +36,30 @@ int kvm_iommu_map_pages(struct kvm *kvm,
{
gfn_t gfn = base_gfn;
pfn_t pfn;
- int i, r;
+ int i, r = 0;
struct dmar_domain *domain = kvm->arch.intel_iommu_domain;
/* check if iommu exists and in use */
if (!domain)
return 0;
- r = -EINVAL;
for (i = 0; i < npages; i++) {
/* check if already mapped */
pfn = (pfn_t)intel_iommu_iova_to_pfn(domain,
gfn_to_gpa(gfn));
- if (pfn && !is_mmio_pfn(pfn))
+ if (pfn)
continue;
pfn = gfn_to_pfn(kvm, gfn);
- if (!is_mmio_pfn(pfn)) {
- r = intel_iommu_page_mapping(domain,
- gfn_to_gpa(gfn),
- pfn_to_hpa(pfn),
- PAGE_SIZE,
- DMA_PTE_READ |
- DMA_PTE_WRITE);
- if (r) {
- printk(KERN_DEBUG "kvm_iommu_map_pages:"
- "iommu failed to map pfn=%lx\n", pfn);
- goto unmap_pages;
- }
- } else {
- printk(KERN_DEBUG "kvm_iommu_map_page:"
- "invalid pfn=%lx\n", pfn);
+ r = intel_iommu_page_mapping(domain,
+ gfn_to_gpa(gfn),
+ pfn_to_hpa(pfn),
+ PAGE_SIZE,
+ DMA_PTE_READ |
+ DMA_PTE_WRITE);
+ if (r) {
+ printk(KERN_ERR "kvm_iommu_map_pages:"
+ "iommu failed to map pfn=%lx\n", pfn);
goto unmap_pages;
}
gfn++;