KVM: x86/mmu: Hoist ITLB multi-hit workaround check up a level
authorSean Christopherson <sean.j.christopherson@intel.com>
Wed, 23 Sep 2020 18:37:34 +0000 (11:37 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 28 Sep 2020 11:57:43 +0000 (07:57 -0400)
Move the "ITLB multi-hit workaround enabled" check into the callers of
disallowed_hugepage_adjust() to make it more obvious that the helper is
specific to the workaround, and to be consistent with the accounting,
i.e. account_huge_nx_page() is called if and only if the workaround is
enabled.

No functional change intended.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Message-Id: <20200923183735.584-8-sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/mmu.c
arch/x86/kvm/mmu/paging_tmpl.h

index 4b8d336..ae47a0a 100644 (file)
@@ -3329,7 +3329,6 @@ static void disallowed_hugepage_adjust(struct kvm_shadow_walk_iterator it,
        u64 spte = *it.sptep;
 
        if (it.level == level && level > PG_LEVEL_4K &&
-           is_nx_huge_page_enabled() &&
            is_shadow_present_pte(spte) &&
            !is_large_pte(spte)) {
                /*
@@ -3371,7 +3370,8 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code,
                 * We cannot overwrite existing page tables with an NX
                 * large page, as the leaf could be executable.
                 */
-               disallowed_hugepage_adjust(it, gfn, &pfn, &level);
+               if (nx_huge_page_workaround_enabled)
+                       disallowed_hugepage_adjust(it, gfn, &pfn, &level);
 
                base_gfn = gfn & ~(KVM_PAGES_PER_HPAGE(it.level) - 1);
                if (it.level == level)
index c7af445..479b65d 100644 (file)
@@ -694,7 +694,8 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr,
                 * We cannot overwrite existing page tables with an NX
                 * large page, as the leaf could be executable.
                 */
-               disallowed_hugepage_adjust(it, gw->gfn, &pfn, &level);
+               if (nx_huge_page_workaround_enabled)
+                       disallowed_hugepage_adjust(it, gw->gfn, &pfn, &level);
 
                base_gfn = gw->gfn & ~(KVM_PAGES_PER_HPAGE(it.level) - 1);
                if (it.level == level)