From 61028d958dc7c57ee02de32ea89b025dccb9650d Mon Sep 17 00:00:00 2001
From: Weidong Han [EMAIL PROTECTED]
Date: Thu, 25 Sep 2008 23:32:02 +0800
Subject: [PATCH] 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 [EMAIL PROTECTED]
---
arch/x86/kvm/vtd.c | 29 +++--
include/asm-x86/kvm_host.h |2 --
virt/kvm/kvm_main.c|2 +-
3 files changed, 12 insertions(+), 21 deletions(-)
diff --git a/arch/x86/kvm/vtd.c b/arch/x86/kvm/vtd.c
index 667bf3f..a770874 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++;
diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h
index d1175b8..357dd20 100644
--- a/include/asm-x86/kvm_host.h
+++ b/include/asm-x86/kvm_host.h
@@ -495,8 +495,6 @@ int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t
gpa,
int kvm_pv_mmu_op(struct kvm_vcpu *vcpu, unsigned long bytes,
gpa_t addr, unsigned long *ret);
-int is_mmio_pfn(pfn_t pfn);
-
extern bool tdp_enabled;
enum emulation_result {
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 6cf0427..98cd916 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -76,7 +76,7 @@ static inline int valid_vcpu(int n)
return likely(n = 0 n KVM_MAX_VCPUS);
}
-inline int is_mmio_pfn(pfn_t pfn)
+static inline int is_mmio_pfn(pfn_t pfn)
{
if (pfn_valid(pfn))
return PageReserved(pfn_to_page(pfn));
--
1.5.1
0001-Map-mmio-pages-into-VT-d-page-table.patch
Description: 0001-Map-mmio-pages-into-VT-d-page-table.patch