diff options
Diffstat (limited to 'drivers/kvm')
-rw-r--r-- | drivers/kvm/paging_tmpl.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/kvm/paging_tmpl.h b/drivers/kvm/paging_tmpl.h index 03c474aaedde..6acb16ea5ce2 100644 --- a/drivers/kvm/paging_tmpl.h +++ b/drivers/kvm/paging_tmpl.h | |||
@@ -271,6 +271,7 @@ static int FNAME(fix_write_pf)(struct kvm_vcpu *vcpu, | |||
271 | pt_element_t *guest_ent; | 271 | pt_element_t *guest_ent; |
272 | int writable_shadow; | 272 | int writable_shadow; |
273 | gfn_t gfn; | 273 | gfn_t gfn; |
274 | struct kvm_mmu_page *page; | ||
274 | 275 | ||
275 | if (is_writeble_pte(*shadow_ent)) | 276 | if (is_writeble_pte(*shadow_ent)) |
276 | return 0; | 277 | return 0; |
@@ -303,7 +304,17 @@ static int FNAME(fix_write_pf)(struct kvm_vcpu *vcpu, | |||
303 | } | 304 | } |
304 | 305 | ||
305 | gfn = walker->gfn; | 306 | gfn = walker->gfn; |
306 | if (kvm_mmu_lookup_page(vcpu, gfn)) { | 307 | |
308 | if (user) { | ||
309 | /* | ||
310 | * Usermode page faults won't be for page table updates. | ||
311 | */ | ||
312 | while ((page = kvm_mmu_lookup_page(vcpu, gfn)) != NULL) { | ||
313 | pgprintk("%s: zap %lx %x\n", | ||
314 | __FUNCTION__, gfn, page->role.word); | ||
315 | kvm_mmu_zap_page(vcpu, page); | ||
316 | } | ||
317 | } else if (kvm_mmu_lookup_page(vcpu, gfn)) { | ||
307 | pgprintk("%s: found shadow page for %lx, marking ro\n", | 318 | pgprintk("%s: found shadow page for %lx, marking ro\n", |
308 | __FUNCTION__, gfn); | 319 | __FUNCTION__, gfn); |
309 | *write_pt = 1; | 320 | *write_pt = 1; |