Skip to contentSkip to conversation

KVM: pci passthrough un-page-aligned mmio device on machines w/o VT-d

PATCH In review 刘晓建 2 participants 2 messages Dec 15, 2008 – Dec 16, 2008 KVM

lore
Share & tools
lore

刘晓建

author
#0 lore raw

PATCH 3/3 KVM: pci passthrough un-page-aligned mmio device on machines w/o VT-d

the KVM79 doesn't support the case of running pci passthrough on a machine w/o VT-d. The following fixes it
---

kernel/x86/kvm_main.c 2008-12-12 15:56:19.000000000 +0800 renamed from kernel/x86/kvm_main.c 2008-11-12 20:24:04.000000000 +0800 +11 -0
diff -uNr kvm-79/kernel/x86/kvm_main.c kvm-79-fixed/kernel/x86/kvm_main.c
@@ -1059,11 +1061,22 @@
 struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn)
 {
  pfn_t pfn;
+ pfn_t reserved_top = 0;
 
  pfn = gfn_to_pfn(kvm, gfn);
  if (!kvm_is_mmio_pfn(pfn))
  return pfn_to_page(pfn);
 
+#ifdef CONFIG_RESERVE_PHYSICAL_START
+ reserved_top = __PHYSICAL_START>>PAGE_SHIFT;
+#else
+#warning   if you want to use pci passthrough w/o mechanisms like VT-d,
+#warning   please define CONFIG_RESERVE_PHYSICAL_START and __PHYSICAL_START, 
+#warning   when compiling your linux kernel!
+#endif
+ if(pfn < reserved_top)
+     return pfn_to_page(pfn);
+
  WARN_ON(kvm_is_mmio_pfn(pfn));
 
  get_page(bad_page);

Xiaojian Liu

#1 lore raw

Xiaojian,
For generating the patches for kvm module, you needs to use kvm.git as development tree instead of kvm's release tarball. The source files in release tarball have been hacked before release out, and maybe different with kernel's. So please clone kvm.git through git.kernel.org first and re-create the patchset.
Xiantao

Quoted 32 lines · 刘晓建

the KVM79 doesn't support the case of running pci passthrough on a machine w/o VT-d. The following fixes it
---
diff -uNr kvm-79/kernel/x86/kvm_main.c kvm-79-fixed/kernel/x86/kvm_main.c --- kvm-79/kernel/x86/kvm_main.c

2008-11-12 20:24:04.000000000 +0800 +++

kvm-79-fixed/kernel/x86/kvm_main.c 2008-12-12 15:56:19.000000000
+0800 @@ -1059,11 +1061,22 @@ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) {
pfn_t pfn;
+ pfn_t reserved_top = 0;

  pfn = gfn_to_pfn(kvm, gfn);
  if (!kvm_is_mmio_pfn(pfn))
  return pfn_to_page(pfn);
kernel/x86/kvm_main.c 2008-12-12 15:56:19.000000000 +0800 renamed from kernel/x86/kvm_main.c 2008-11-12 20:24:04.000000000 +0800 +4 -0
+#ifdef CONFIG_RESERVE_PHYSICAL_START
+ reserved_top = __PHYSICAL_START>>PAGE_SHIFT;
+#else
+#warning   if you want to use pci passthrough w/o mechanisms like

VT-d, +#warning please define CONFIG_RESERVE_PHYSICAL_START and
__PHYSICAL_START, +#warning when compiling your linux kernel!

kernel/x86/kvm_main.c 2008-12-12 15:56:19.000000000 +0800 renamed from kernel/x86/kvm_main.c 2008-11-12 20:24:04.000000000 +0800 +4 -0
+#endif
+ if(pfn < reserved_top)
+     return pfn_to_page(pfn);
+
  WARN_ON(kvm_is_mmio_pfn(pfn));
 
  get_page(bad_page);

Xiaojian Liu