diff options
| author | Marcelo Tosatti <mtosatti@redhat.com> | 2008-07-10 19:54:29 -0400 |
|---|---|---|
| committer | Avi Kivity <avi@qumranet.com> | 2008-07-20 05:42:40 -0400 |
| commit | 376c53c2b30d4a1955240f59f4ecd959aa118f92 (patch) | |
| tree | a4d7e1f1d26f30ba717d7331ec8e85c0faa4add3 | |
| parent | 34d4cb8fca1f2a31be152b74797e6cd160ec9de6 (diff) | |
KVM: MMU: improve invalid shadow root page handling
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>
| -rw-r--r-- | arch/x86/kvm/mmu.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index ff7cf632175b..7f57da663826 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -930,14 +930,17 @@ static void kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp) | |||
| 930 | } | 930 | } |
| 931 | kvm_mmu_page_unlink_children(kvm, sp); | 931 | kvm_mmu_page_unlink_children(kvm, sp); |
| 932 | if (!sp->root_count) { | 932 | if (!sp->root_count) { |
| 933 | if (!sp->role.metaphysical) | 933 | if (!sp->role.metaphysical && !sp->role.invalid) |
| 934 | unaccount_shadowed(kvm, sp->gfn); | 934 | unaccount_shadowed(kvm, sp->gfn); |
| 935 | hlist_del(&sp->hash_link); | 935 | hlist_del(&sp->hash_link); |
| 936 | kvm_mmu_free_page(kvm, sp); | 936 | kvm_mmu_free_page(kvm, sp); |
| 937 | } else { | 937 | } else { |
| 938 | int invalid = sp->role.invalid; | ||
| 938 | list_move(&sp->link, &kvm->arch.active_mmu_pages); | 939 | list_move(&sp->link, &kvm->arch.active_mmu_pages); |
| 939 | sp->role.invalid = 1; | 940 | sp->role.invalid = 1; |
| 940 | kvm_reload_remote_mmus(kvm); | 941 | kvm_reload_remote_mmus(kvm); |
| 942 | if (!sp->role.metaphysical && !invalid) | ||
| 943 | unaccount_shadowed(kvm, sp->gfn); | ||
| 941 | } | 944 | } |
| 942 | kvm_mmu_reset_last_pte_updated(kvm); | 945 | kvm_mmu_reset_last_pte_updated(kvm); |
| 943 | } | 946 | } |
