KVM: x86/pmu: Don't tell userspace to save PMU MSRs if PMU is disabled
authorSean Christopherson <seanjc@google.com>
Tue, 24 Jan 2023 23:49:03 +0000 (23:49 +0000)
committerSean Christopherson <seanjc@google.com>
Fri, 27 Jan 2023 02:03:42 +0000 (18:03 -0800)
Omit all PMU MSRs from the "MSRs to save" list if the PMU is disabled so
that userspace doesn't waste time saving and restoring dummy values.  KVM
provides "error" semantics (read zeros, drop writes) for such known-but-
unsupported MSRs, i.e. has fudged around this issue for quite some time.
Keep the "error" semantics as-is for now, the logic will be cleaned up in
a separate patch.

Cc: Aaron Lewis <aaronlewis@google.com>
Cc: Weijiang Yang <weijiang.yang@intel.com>
Link: https://lore.kernel.org/r/20230124234905.3774678-5-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/x86.c

index 9b6e1af63531fb0305f35ca2e7a2e5671e96596e..25da2cc09e558e84439dfd9353c10a0d172cec71 100644 (file)
@@ -7081,8 +7081,10 @@ static void kvm_init_msr_list(void)
        for (i = 0; i < ARRAY_SIZE(msrs_to_save_base); i++)
                kvm_probe_msr_to_save(msrs_to_save_base[i]);
 
-       for (i = 0; i < ARRAY_SIZE(msrs_to_save_pmu); i++)
-               kvm_probe_msr_to_save(msrs_to_save_pmu[i]);
+       if (enable_pmu) {
+               for (i = 0; i < ARRAY_SIZE(msrs_to_save_pmu); i++)
+                       kvm_probe_msr_to_save(msrs_to_save_pmu[i]);
+       }
 
        for (i = 0; i < ARRAY_SIZE(emulated_msrs_all); i++) {
                if (!static_call(kvm_x86_has_emulated_msr)(NULL, emulated_msrs_all[i]))