aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/kvm_main.c
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@cn.fujitsu.com>2010-08-28 07:24:13 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:51:48 -0400
commit365fb3fdf6769d3553999d8eb6cc2a8c56c747c1 (patch)
treee8ac38a587a4cf2cac88df4580e7112c15b13e14 /virt/kvm/kvm_main.c
parentbc32ce2152406431acf4daf4a81dc1664bb7b91b (diff)
KVM: MMU: rewrite audit_mappings_page() function
There is a bugs in this function, we call gfn_to_pfn() and kvm_mmu_gva_to_gpa_read() in atomic context(kvm_mmu_audit() is called under the spinlock(mmu_lock)'s protection). This patch fix it by: - introduce gfn_to_pfn_atomic instead of gfn_to_pfn - get the mapping gfn from kvm_mmu_page_get_gfn() And it adds 'notrap' ptes check in unsync/direct sps Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r--virt/kvm/kvm_main.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 2eb0b7500a2a..c7a57b4feb39 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -999,7 +999,7 @@ pfn_t hva_to_pfn_atomic(struct kvm *kvm, unsigned long addr)
999} 999}
1000EXPORT_SYMBOL_GPL(hva_to_pfn_atomic); 1000EXPORT_SYMBOL_GPL(hva_to_pfn_atomic);
1001 1001
1002pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn) 1002static pfn_t __gfn_to_pfn(struct kvm *kvm, gfn_t gfn, bool atomic)
1003{ 1003{
1004 unsigned long addr; 1004 unsigned long addr;
1005 1005
@@ -1009,7 +1009,18 @@ pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn)
1009 return page_to_pfn(bad_page); 1009 return page_to_pfn(bad_page);
1010 } 1010 }
1011 1011
1012 return hva_to_pfn(kvm, addr, false); 1012 return hva_to_pfn(kvm, addr, atomic);
1013}
1014
1015pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn)
1016{
1017 return __gfn_to_pfn(kvm, gfn, true);
1018}
1019EXPORT_SYMBOL_GPL(gfn_to_pfn_atomic);
1020
1021pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn)
1022{
1023 return __gfn_to_pfn(kvm, gfn, false);
1013} 1024}
1014EXPORT_SYMBOL_GPL(gfn_to_pfn); 1025EXPORT_SYMBOL_GPL(gfn_to_pfn);
1015 1026