diff options
| -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 | } |
