|
@@ -271,6 +271,7 @@ static int FNAME(fix_write_pf)(struct kvm_vcpu *vcpu,
|
|
|
pt_element_t *guest_ent;
|
|
|
int writable_shadow;
|
|
|
gfn_t gfn;
|
|
|
+ struct kvm_mmu_page *page;
|
|
|
|
|
|
if (is_writeble_pte(*shadow_ent))
|
|
|
return 0;
|
|
@@ -303,7 +304,17 @@ static int FNAME(fix_write_pf)(struct kvm_vcpu *vcpu,
|
|
|
}
|
|
|
|
|
|
gfn = walker->gfn;
|
|
|
- if (kvm_mmu_lookup_page(vcpu, gfn)) {
|
|
|
+
|
|
|
+ if (user) {
|
|
|
+ /*
|
|
|
+ * Usermode page faults won't be for page table updates.
|
|
|
+ */
|
|
|
+ while ((page = kvm_mmu_lookup_page(vcpu, gfn)) != NULL) {
|
|
|
+ pgprintk("%s: zap %lx %x\n",
|
|
|
+ __FUNCTION__, gfn, page->role.word);
|
|
|
+ kvm_mmu_zap_page(vcpu, page);
|
|
|
+ }
|
|
|
+ } else if (kvm_mmu_lookup_page(vcpu, gfn)) {
|
|
|
pgprintk("%s: found shadow page for %lx, marking ro\n",
|
|
|
__FUNCTION__, gfn);
|
|
|
*write_pt = 1;
|