KVM: MMU: improve invalid shadow root page handling
authorMarcelo Tosatti <mtosatti@redhat.com>
Thu, 10 Jul 2008 23:54:29 +0000 (20:54 -0300)
committerAvi Kivity <avi@qumranet.com>
Sun, 20 Jul 2008 09:42:40 +0000 (12:42 +0300)
Harden kvm_mmu_zap_page() against invalid root pages that
had been shadowed from memslots that are gone.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
arch/x86/kvm/mmu.c

index ff7cf632175bdd3c9cd7a20e08ede0c49a614bb2..7f57da66382692dd15e385a99184befdc668831d 100644 (file)
@@ -930,14 +930,17 @@ static void kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp)
        }
        kvm_mmu_page_unlink_children(kvm, sp);
        if (!sp->root_count) {
-               if (!sp->role.metaphysical)
+               if (!sp->role.metaphysical && !sp->role.invalid)
                        unaccount_shadowed(kvm, sp->gfn);
                hlist_del(&sp->hash_link);
                kvm_mmu_free_page(kvm, sp);
        } else {
+               int invalid = sp->role.invalid;
                list_move(&sp->link, &kvm->arch.active_mmu_pages);
                sp->role.invalid = 1;
                kvm_reload_remote_mmus(kvm);
+               if (!sp->role.metaphysical && !invalid)
+                       unaccount_shadowed(kvm, sp->gfn);
        }
        kvm_mmu_reset_last_pte_updated(kvm);
 }