summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/mmu.c
diff options
context:
space:
mode:
authorIzik Eidus <izike@qumranet.com>2008-03-20 17:17:24 +0100
committerAvi Kivity <avi@qumranet.com>2008-04-27 11:00:34 +0200
commit855149aaa90016c576a0e684361a34f8047307d0 (patch)
treebfca7a0e52e4a4e7857a2e9fc0ff9f98e9f26dfa /arch/x86/kvm/mmu.c
parentKVM: Move some x86 specific constants and structures to include/asm-x86 (diff)
downloadlinux-855149aaa90016c576a0e684361a34f8047307d0.tar.xz
linux-855149aaa90016c576a0e684361a34f8047307d0.zip
KVM: MMU: fix dirty bit setting when removing write permissions
When mmu_set_spte() checks if a page related to spte should be release as dirty or clean, it check if the shadow pte was writeble, but in case rmap_write_protect() is called called it is possible for shadow ptes that were writeble to become readonly and therefor mmu_set_spte will release the pages as clean. This patch fix this issue by marking the page as dirty inside rmap_write_protect(). Signed-off-by: Izik Eidus <izike@qumranet.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm/mmu.c')
-rw-r--r--arch/x86/kvm/mmu.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index a5872b3c466d..dd4b95b3896b 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -626,6 +626,14 @@ static void rmap_write_protect(struct kvm *kvm, u64 gfn)
}
spte = rmap_next(kvm, rmapp, spte);
}
+ if (write_protected) {
+ struct page *page;
+
+ spte = rmap_next(kvm, rmapp, NULL);
+ page = pfn_to_page((*spte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT);
+ SetPageDirty(page);
+ }
+
/* check for huge page mappings */
rmapp = gfn_to_rmap(kvm, gfn, 1);
spte = rmap_next(kvm, rmapp, NULL);