From 5346de056617b7e7dd6365a8b51e4f4f8e63d595 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Fri, 5 Jan 2007 16:36:52 -0800 Subject: [PATCH] --- yaml --- r: 45280 b: refs/heads/master c: 143646567f6dcd584e1ab359b5ec83e0545e70cf h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/kvm/paging_tmpl.h | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 8003bb310145..8f858b0b5aee 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 32b35627355c3bf17e1903efd117efed7653a54e +refs/heads/master: 143646567f6dcd584e1ab359b5ec83e0545e70cf diff --git a/trunk/drivers/kvm/paging_tmpl.h b/trunk/drivers/kvm/paging_tmpl.h index 03c474aaedde..6acb16ea5ce2 100644 --- a/trunk/drivers/kvm/paging_tmpl.h +++ b/trunk/drivers/kvm/paging_tmpl.h @@ -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;