By making the last three statements common to both if/else cases, the
symmetry between the locking and unlocking becomes clearer. One note
here is that VCPU's root_hpa does not need to be protected by mmu_lock.

Signed-off-by: Takuya Yoshikawa <[email protected]>
---
 arch/x86/kvm/mmu.c |   39 +++++++++++++++++++--------------------
 1 files changed, 19 insertions(+), 20 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index d01f340..bf80b46 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -2861,42 +2861,41 @@ out_unlock:
 static void mmu_free_roots(struct kvm_vcpu *vcpu)
 {
        int i;
+       hpa_t root;
        struct kvm_mmu_page *sp;
        LIST_HEAD(invalid_list);
 
        if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
                return;
+
        spin_lock(&vcpu->kvm->mmu_lock);
+
        if (vcpu->arch.mmu.shadow_root_level == PT64_ROOT_LEVEL &&
            (vcpu->arch.mmu.root_level == PT64_ROOT_LEVEL ||
             vcpu->arch.mmu.direct_map)) {
-               hpa_t root = vcpu->arch.mmu.root_hpa;
-
+               root = vcpu->arch.mmu.root_hpa;
                sp = page_header(root);
                --sp->root_count;
-               if (!sp->root_count && sp->role.invalid) {
+               if (!sp->root_count && sp->role.invalid)
                        kvm_mmu_prepare_zap_page(vcpu->kvm, sp, &invalid_list);
-                       kvm_mmu_commit_zap_page(vcpu->kvm, &invalid_list);
+       } else {
+               for (i = 0; i < 4; ++i) {
+                       root = vcpu->arch.mmu.pae_root[i];
+                       if (root) {
+                               root &= PT64_BASE_ADDR_MASK;
+                               sp = page_header(root);
+                               --sp->root_count;
+                               if (!sp->root_count && sp->role.invalid)
+                                       kvm_mmu_prepare_zap_page(vcpu->kvm, sp,
+                                                                &invalid_list);
+                       }
+                       vcpu->arch.mmu.pae_root[i] = INVALID_PAGE;
                }
-               vcpu->arch.mmu.root_hpa = INVALID_PAGE;
-               spin_unlock(&vcpu->kvm->mmu_lock);
-               return;
        }
-       for (i = 0; i < 4; ++i) {
-               hpa_t root = vcpu->arch.mmu.pae_root[i];
 
-               if (root) {
-                       root &= PT64_BASE_ADDR_MASK;
-                       sp = page_header(root);
-                       --sp->root_count;
-                       if (!sp->root_count && sp->role.invalid)
-                               kvm_mmu_prepare_zap_page(vcpu->kvm, sp,
-                                                        &invalid_list);
-               }
-               vcpu->arch.mmu.pae_root[i] = INVALID_PAGE;
-       }
        kvm_mmu_commit_zap_page(vcpu->kvm, &invalid_list);
        spin_unlock(&vcpu->kvm->mmu_lock);
+
        vcpu->arch.mmu.root_hpa = INVALID_PAGE;
 }
 
-- 
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to