Re: [PATCH v4 09/25] KVM: VMX: nVMX: Support TSC scaling and PERF_GLOBAL_CTRL with enlightened VMCS

From: Paolo Bonzini
Date: Thu Jul 28 2022 - 17:52:13 EST


On 7/25/22 20:18, Sean Christopherson wrote:
I kind of like the idea of having a two-dimensional array based on the enums
instead of switch statements, so for now I'll keep Vitaly's enums.
I don't have a strong opinion on using a 2d array, but unless I'm missing something,
that's nowhere to be found in this patch. IMO, having the enums without them
providing any unique value is silly and obfuscates the code.

Yeah, like this:

diff --git a/arch/x86/kvm/vmx/evmcs.c b/arch/x86/kvm/vmx/evmcs.c
index d8da4026c93d..8055128d8638 100644
--- a/arch/x86/kvm/vmx/evmcs.c
+++ b/arch/x86/kvm/vmx/evmcs.c
@@ -342,9 +342,10 @@ uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu)
return 0;
}
-enum evmcs_v1_revision {
+enum evmcs_revision {
EVMCSv1_2016,
EVMCSv1_2022,
+ EVMCS_REVISION_MAX,
};
enum evmcs_unsupported_ctrl_type {
@@ -353,13 +354,37 @@ enum evmcs_unsupported_ctrl_type {
EVMCS_2NDEXEC,
EVMCS_PINCTRL,
EVMCS_VMFUNC,
+ EVMCS_CTRL_MAX,
+};
+
+static u32 evmcs_unsupported_ctls[EVMCS_CTRL_MAX][EVMCS_REVISION_MAX] = {
+ [EVMCS_EXIT_CTLS] = {
+ [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_VMEXIT_CTRL | VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL,
+ [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_VMEXIT_CTRL,
+ },
+ [EVMCS_ENTRY_CTLS] = {
+ [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_VMENTRY_CTRL | VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL,
+ [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_VMENTRY_CTRL,
+ },
+ [EVMCS_2NDEXEC] = {
+ [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_2NDEXEC | SECONDARY_EXEC_TSC_SCALING,
+ [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_2NDEXEC,
+ },
+ [EVMCS_PINCTRL] = {
+ [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_PINCTRL,
+ [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_PINCTRL,
+ },
+ [EVMCS_VMFUNC] = {
+ [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_VMFUNC,
+ [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_VMFUNC,
+ },
};
static u32 evmcs_get_unsupported_ctls(struct kvm_vcpu *vcpu,
enum evmcs_unsupported_ctrl_type ctrl_type)
{
struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
- enum evmcs_v1_revision evmcs_rev = EVMCSv1_2016;
+ enum evmcs_revision evmcs_rev = EVMCSv1_2016;
if (!hv_vcpu)
return 0;
@@ -367,32 +392,7 @@ static u32 evmcs_get_unsupported_ctls(struct kvm_vcpu *vcpu,
if (hv_vcpu->cpuid_cache.nested_ebx & HV_X64_NESTED_EVMCS1_2022_UPDATE)
evmcs_rev = EVMCSv1_2022;
- switch (ctrl_type) {
- case EVMCS_EXIT_CTLS:
- if (evmcs_rev == EVMCSv1_2016)
- return EVMCS1_UNSUPPORTED_VMEXIT_CTRL |
- VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL;
- else
- return EVMCS1_UNSUPPORTED_VMEXIT_CTRL;
- case EVMCS_ENTRY_CTLS:
- if (evmcs_rev == EVMCSv1_2016)
- return EVMCS1_UNSUPPORTED_VMENTRY_CTRL |
- VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL;
- else
- return EVMCS1_UNSUPPORTED_VMENTRY_CTRL;
- case EVMCS_2NDEXEC:
- if (evmcs_rev == EVMCSv1_2016)
- return EVMCS1_UNSUPPORTED_2NDEXEC |
- SECONDARY_EXEC_TSC_SCALING;
- else
- return EVMCS1_UNSUPPORTED_2NDEXEC;
- case EVMCS_PINCTRL:
- return EVMCS1_UNSUPPORTED_PINCTRL;
- case EVMCS_VMFUNC:
- return EVMCS1_UNSUPPORTED_VMFUNC;
- }
-
- return 0;
+ return evmcs_unsupported_ctls[ctrl_type][evmcs_rev];
}
void nested_evmcs_filter_control_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)

Paolo