summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcelo Tosatti <mtosatti@redhat.com>2008-06-08 01:48:53 -0300
committerAvi Kivity <avi@qumranet.com>2008-06-24 12:17:10 +0300
commit6597ca09e6c0e5aec7ffd2b8ab48c671d3c28414 (patch)
tree9bbe5dab501fa1369ce882a4713ebdd227e09f19
parent06e05645661211b9eaadaf6344c335d2e80f0ba2 (diff)
downloadkernel-crypto-6597ca09e6c0e5aec7ffd2b8ab48c671d3c28414.tar.gz
kernel-crypto-6597ca09e6c0e5aec7ffd2b8ab48c671d3c28414.tar.xz
kernel-crypto-6597ca09e6c0e5aec7ffd2b8ab48c671d3c28414.zip
KVM: MMU: Fix rmap_write_protect() hugepage iteration bug
rmap_next() does not work correctly after rmap_remove(), as it expects the rmap chains not to change during iteration. Fix (for now) by restarting iteration from the beginning. Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r--arch/x86/kvm/mmu.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index ee3f53098f0..9628091c574 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -640,6 +640,7 @@ static void rmap_write_protect(struct kvm *kvm, u64 gfn)
rmap_remove(kvm, spte);
--kvm->stat.lpages;
set_shadow_pte(spte, shadow_trap_nonpresent_pte);
+ spte = NULL;
write_protected = 1;
}
spte = rmap_next(kvm, rmapp, spte);