[PATCH 2/2] KVM: x86: Cache guest CPUID's PDMC for fast lookup

From: Sean Christopherson
Date: Tue Jul 26 2022 - 12:37:49 EST


Add a cache entry for X86_FEATURE_PDCM to allow for expedited lookups.
For all intents and purposes, VMX queries X86_FEATURE_PDCM by default on
every VM-Enter.

Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
---
arch/x86/kvm/cpuid.c | 1 +
arch/x86/kvm/cpuid.h | 5 +++++
2 files changed, 6 insertions(+)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 27b25fdb4335..fd32fddd7bc1 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -420,6 +420,7 @@ static int kvm_set_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid_entry2 *e2,

/* Update the cache before doing anything else. */
vcpu->arch.kvm_cpuid_x86_feature_cache = 0;
+ kvm_cpuid_cache_update(vcpu, X86_FEATURE_PDCM);

kvm_update_kvm_cpuid_base(vcpu);
kvm_vcpu_after_set_cpuid(vcpu);
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 49009d16022a..65114cf7742e 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -86,6 +86,7 @@ static __always_inline u32 *guest_cpuid_get_register(struct kvm_vcpu *vcpu,
}

enum kvm_cpuid_cached_feature {
+ KVM_CACHED_X86_FEATURE_PDCM,
NR_KVM_CACHED_X86_FEATURES,
};

@@ -95,6 +96,10 @@ static __always_inline int guest_cpuid_get_cache_bit(unsigned int x86_feature)

BUILD_BUG_ON(NR_KVM_CACHED_X86_FEATURES > cache_bytes * BITS_PER_BYTE);

+ /* Use a "dumb" if statement, this is all resolved at compile time. */
+ if (x86_feature == X86_FEATURE_PDCM)
+ return KVM_CACHED_X86_FEATURE_PDCM;
+
return NR_KVM_CACHED_X86_FEATURES;
}

--
2.37.1.455.g008518b4e5-goog


--dx/GFEplJzZRgpXz--