summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
authorIzik Eidus <izike@qumranet.com>2008-01-12 22:49:09 +0100
committerAvi Kivity <avi@qumranet.com>2008-01-30 17:01:22 +0100
commit75e68e607896c84310dee37c783c45220e56ce8c (patch)
treed211007d0d2923d5f831f0d9d90f48f3298e559d /arch/x86/kvm
parentKVM: Portability: Move kvm_fpu to asm-x86/kvm.h (diff)
downloadlinux-75e68e607896c84310dee37c783c45220e56ce8c.tar.xz
linux-75e68e607896c84310dee37c783c45220e56ce8c.zip
KVM: MMU: Fix dirty page setting for pages removed from rmap
Right now rmap_remove won't set the page as dirty if the shadow pte pointed to this page had write access and then it became readonly. This patches fixes that, by setting the page as dirty for spte changes from write to readonly access. Signed-off-by: Izik Eidus <izike@qumranet.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/mmu.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index c478ee25de66..8efdcdbebb03 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -890,6 +890,7 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte,
{
u64 spte;
int was_rmapped = is_rmap_pte(*shadow_pte);
+ int was_writeble = is_writeble_pte(*shadow_pte);
pgprintk("%s: spte %llx access %x write_fault %d"
" user_fault %d gfn %lx\n",
@@ -956,9 +957,12 @@ unshadowed:
rmap_add(vcpu, shadow_pte, gfn);
if (!is_rmap_pte(*shadow_pte))
kvm_release_page_clean(page);
+ } else {
+ if (was_writeble)
+ kvm_release_page_dirty(page);
+ else
+ kvm_release_page_clean(page);
}
- else
- kvm_release_page_clean(page);
if (!ptwrite || !*ptwrite)
vcpu->arch.last_pte_updated = shadow_pte;
}