diff options
Diffstat (limited to 'arch/x86/kvm/mmu.c')
-rw-r--r-- | arch/x86/kvm/mmu.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 3da2508eb22a..81016a3a6fd3 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -991,11 +991,10 @@ static void kvm_mmu_reset_last_pte_updated(struct kvm *kvm) | |||
991 | kvm->vcpus[i]->arch.last_pte_updated = NULL; | 991 | kvm->vcpus[i]->arch.last_pte_updated = NULL; |
992 | } | 992 | } |
993 | 993 | ||
994 | static void kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp) | 994 | static void kvm_mmu_unlink_parents(struct kvm *kvm, struct kvm_mmu_page *sp) |
995 | { | 995 | { |
996 | u64 *parent_pte; | 996 | u64 *parent_pte; |
997 | 997 | ||
998 | ++kvm->stat.mmu_shadow_zapped; | ||
999 | while (sp->multimapped || sp->parent_pte) { | 998 | while (sp->multimapped || sp->parent_pte) { |
1000 | if (!sp->multimapped) | 999 | if (!sp->multimapped) |
1001 | parent_pte = sp->parent_pte; | 1000 | parent_pte = sp->parent_pte; |
@@ -1010,7 +1009,13 @@ static void kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp) | |||
1010 | kvm_mmu_put_page(sp, parent_pte); | 1009 | kvm_mmu_put_page(sp, parent_pte); |
1011 | set_shadow_pte(parent_pte, shadow_trap_nonpresent_pte); | 1010 | set_shadow_pte(parent_pte, shadow_trap_nonpresent_pte); |
1012 | } | 1011 | } |
1012 | } | ||
1013 | |||
1014 | static void kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp) | ||
1015 | { | ||
1016 | ++kvm->stat.mmu_shadow_zapped; | ||
1013 | kvm_mmu_page_unlink_children(kvm, sp); | 1017 | kvm_mmu_page_unlink_children(kvm, sp); |
1018 | kvm_mmu_unlink_parents(kvm, sp); | ||
1014 | if (!sp->root_count) { | 1019 | if (!sp->root_count) { |
1015 | if (!sp->role.metaphysical && !sp->role.invalid) | 1020 | if (!sp->role.metaphysical && !sp->role.invalid) |
1016 | unaccount_shadowed(kvm, sp->gfn); | 1021 | unaccount_shadowed(kvm, sp->gfn); |