aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/async_pf.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/async_pf.c')
-rw-r--r--virt/kvm/async_pf.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c
index efeceb0a222d..3815e940fbea 100644
--- a/virt/kvm/async_pf.c
+++ b/virt/kvm/async_pf.c
@@ -76,16 +76,20 @@ static void async_pf_execute(struct work_struct *work)
76 struct kvm_vcpu *vcpu = apf->vcpu; 76 struct kvm_vcpu *vcpu = apf->vcpu;
77 unsigned long addr = apf->addr; 77 unsigned long addr = apf->addr;
78 gva_t gva = apf->gva; 78 gva_t gva = apf->gva;
79 int locked = 1;
79 80
80 might_sleep(); 81 might_sleep();
81 82
82 /* 83 /*
83 * This work is run asynchromously to the task which owns 84 * This work is run asynchromously to the task which owns
84 * mm and might be done in another context, so we must 85 * mm and might be done in another context, so we must
85 * use FOLL_REMOTE. 86 * access remotely.
86 */ 87 */
87 __get_user_pages_unlocked(NULL, mm, addr, 1, NULL, 88 down_read(&mm->mmap_sem);
88 FOLL_WRITE | FOLL_REMOTE); 89 get_user_pages_remote(NULL, mm, addr, 1, FOLL_WRITE, NULL, NULL,
90 &locked);
91 if (locked)
92 up_read(&mm->mmap_sem);
89 93
90 kvm_async_page_present_sync(vcpu, apf); 94 kvm_async_page_present_sync(vcpu, apf);
91 95