aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/kvm_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r--virt/kvm/kvm_main.c48
1 files changed, 37 insertions, 11 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 5225052aebc..75fd590c021 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -55,6 +55,7 @@
55#include <asm-generic/bitops/le.h> 55#include <asm-generic/bitops/le.h>
56 56
57#include "coalesced_mmio.h" 57#include "coalesced_mmio.h"
58#include "async_pf.h"
58 59
59#define CREATE_TRACE_POINTS 60#define CREATE_TRACE_POINTS
60#include <trace/events/kvm.h> 61#include <trace/events/kvm.h>
@@ -186,6 +187,7 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id)
186 vcpu->kvm = kvm; 187 vcpu->kvm = kvm;
187 vcpu->vcpu_id = id; 188 vcpu->vcpu_id = id;
188 init_waitqueue_head(&vcpu->wq); 189 init_waitqueue_head(&vcpu->wq);
190 kvm_async_pf_vcpu_init(vcpu);
189 191
190 page = alloc_page(GFP_KERNEL | __GFP_ZERO); 192 page = alloc_page(GFP_KERNEL | __GFP_ZERO);
191 if (!page) { 193 if (!page) {
@@ -946,15 +948,20 @@ unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn)
946} 948}
947EXPORT_SYMBOL_GPL(gfn_to_hva); 949EXPORT_SYMBOL_GPL(gfn_to_hva);
948 950
949static pfn_t hva_to_pfn(struct kvm *kvm, unsigned long addr, bool atomic) 951static pfn_t hva_to_pfn(struct kvm *kvm, unsigned long addr, bool atomic,
952 bool *async)
950{ 953{
951 struct page *page[1]; 954 struct page *page[1];
952 int npages; 955 int npages = 0;
953 pfn_t pfn; 956 pfn_t pfn;
954 957
955 if (atomic) 958 /* we can do it either atomically or asynchronously, not both */
959 BUG_ON(atomic && async);
960
961 if (atomic || async)
956 npages = __get_user_pages_fast(addr, 1, 1, page); 962 npages = __get_user_pages_fast(addr, 1, 1, page);
957 else { 963
964 if (unlikely(npages != 1) && !atomic) {
958 might_sleep(); 965 might_sleep();
959 npages = get_user_pages_fast(addr, 1, 1, page); 966 npages = get_user_pages_fast(addr, 1, 1, page);
960 } 967 }
@@ -976,6 +983,9 @@ static pfn_t hva_to_pfn(struct kvm *kvm, unsigned long addr, bool atomic)
976 983
977 if (vma == NULL || addr < vma->vm_start || 984 if (vma == NULL || addr < vma->vm_start ||
978 !(vma->vm_flags & VM_PFNMAP)) { 985 !(vma->vm_flags & VM_PFNMAP)) {
986 if (async && !(vma->vm_flags & VM_PFNMAP) &&
987 (vma->vm_flags & VM_WRITE))
988 *async = true;
979 up_read(&current->mm->mmap_sem); 989 up_read(&current->mm->mmap_sem);
980return_fault_page: 990return_fault_page:
981 get_page(fault_page); 991 get_page(fault_page);
@@ -993,32 +1003,41 @@ return_fault_page:
993 1003
994pfn_t hva_to_pfn_atomic(struct kvm *kvm, unsigned long addr) 1004pfn_t hva_to_pfn_atomic(struct kvm *kvm, unsigned long addr)
995{ 1005{
996 return hva_to_pfn(kvm, addr, true); 1006 return hva_to_pfn(kvm, addr, true, NULL);
997} 1007}
998EXPORT_SYMBOL_GPL(hva_to_pfn_atomic); 1008EXPORT_SYMBOL_GPL(hva_to_pfn_atomic);
999 1009
1000static pfn_t __gfn_to_pfn(struct kvm *kvm, gfn_t gfn, bool atomic) 1010static pfn_t __gfn_to_pfn(struct kvm *kvm, gfn_t gfn, bool atomic, bool *async)
1001{ 1011{
1002 unsigned long addr; 1012 unsigned long addr;
1003 1013
1014 if (async)
1015 *async = false;
1016
1004 addr = gfn_to_hva(kvm, gfn); 1017 addr = gfn_to_hva(kvm, gfn);
1005 if (kvm_is_error_hva(addr)) { 1018 if (kvm_is_error_hva(addr)) {
1006 get_page(bad_page); 1019 get_page(bad_page);
1007 return page_to_pfn(bad_page); 1020 return page_to_pfn(bad_page);
1008 } 1021 }
1009 1022
1010 return hva_to_pfn(kvm, addr, atomic); 1023 return hva_to_pfn(kvm, addr, atomic, async);
1011} 1024}
1012 1025
1013pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn) 1026pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn)
1014{ 1027{
1015 return __gfn_to_pfn(kvm, gfn, true); 1028 return __gfn_to_pfn(kvm, gfn, true, NULL);
1016} 1029}
1017EXPORT_SYMBOL_GPL(gfn_to_pfn_atomic); 1030EXPORT_SYMBOL_GPL(gfn_to_pfn_atomic);
1018 1031
1032pfn_t gfn_to_pfn_async(struct kvm *kvm, gfn_t gfn, bool *async)
1033{
1034 return __gfn_to_pfn(kvm, gfn, false, async);
1035}
1036EXPORT_SYMBOL_GPL(gfn_to_pfn_async);
1037
1019pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn) 1038pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn)
1020{ 1039{
1021 return __gfn_to_pfn(kvm, gfn, false); 1040 return __gfn_to_pfn(kvm, gfn, false, NULL);
1022} 1041}
1023EXPORT_SYMBOL_GPL(gfn_to_pfn); 1042EXPORT_SYMBOL_GPL(gfn_to_pfn);
1024 1043
@@ -1026,7 +1045,7 @@ pfn_t gfn_to_pfn_memslot(struct kvm *kvm,
1026 struct kvm_memory_slot *slot, gfn_t gfn) 1045 struct kvm_memory_slot *slot, gfn_t gfn)
1027{ 1046{
1028 unsigned long addr = gfn_to_hva_memslot(slot, gfn); 1047 unsigned long addr = gfn_to_hva_memslot(slot, gfn);
1029 return hva_to_pfn(kvm, addr, false); 1048 return hva_to_pfn(kvm, addr, false, NULL);
1030} 1049}
1031 1050
1032int gfn_to_page_many_atomic(struct kvm *kvm, gfn_t gfn, struct page **pages, 1051int gfn_to_page_many_atomic(struct kvm *kvm, gfn_t gfn, struct page **pages,
@@ -2336,6 +2355,10 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
2336 goto out_free_5; 2355 goto out_free_5;
2337 } 2356 }
2338 2357
2358 r = kvm_async_pf_init();
2359 if (r)
2360 goto out_free;
2361
2339 kvm_chardev_ops.owner = module; 2362 kvm_chardev_ops.owner = module;
2340 kvm_vm_fops.owner = module; 2363 kvm_vm_fops.owner = module;
2341 kvm_vcpu_fops.owner = module; 2364 kvm_vcpu_fops.owner = module;
@@ -2343,7 +2366,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
2343 r = misc_register(&kvm_dev); 2366 r = misc_register(&kvm_dev);
2344 if (r) { 2367 if (r) {
2345 printk(KERN_ERR "kvm: misc device register failed\n"); 2368 printk(KERN_ERR "kvm: misc device register failed\n");
2346 goto out_free; 2369 goto out_unreg;
2347 } 2370 }
2348 2371
2349 kvm_preempt_ops.sched_in = kvm_sched_in; 2372 kvm_preempt_ops.sched_in = kvm_sched_in;
@@ -2353,6 +2376,8 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
2353 2376
2354 return 0; 2377 return 0;
2355 2378
2379out_unreg:
2380 kvm_async_pf_deinit();
2356out_free: 2381out_free:
2357 kmem_cache_destroy(kvm_vcpu_cache); 2382 kmem_cache_destroy(kvm_vcpu_cache);
2358out_free_5: 2383out_free_5:
@@ -2385,6 +2410,7 @@ void kvm_exit(void)
2385 kvm_exit_debug(); 2410 kvm_exit_debug();
2386 misc_deregister(&kvm_dev); 2411 misc_deregister(&kvm_dev);
2387 kmem_cache_destroy(kvm_vcpu_cache); 2412 kmem_cache_destroy(kvm_vcpu_cache);
2413 kvm_async_pf_deinit();
2388 sysdev_unregister(&kvm_sysdev); 2414 sysdev_unregister(&kvm_sysdev);
2389 sysdev_class_unregister(&kvm_sysdev_class); 2415 sysdev_class_unregister(&kvm_sysdev_class);
2390 unregister_reboot_notifier(&kvm_reboot_notifier); 2416 unregister_reboot_notifier(&kvm_reboot_notifier);