lkml.org 
[lkml]   [2022]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 504/545] KVM: x86/pmu: preserve IA32_PERF_CAPABILITIES across CPUID refresh
    Date
    From: Paolo Bonzini <pbonzini@redhat.com>

    [ Upstream commit a755753903a40d982f6dd23d65eb96b248a2577a ]

    Once MSR_IA32_PERF_CAPABILITIES is changed via vmx_set_msr(), the
    value should not be changed by cpuid(). To ensure that the new value
    is kept, the default initialization path is moved to intel_pmu_init().
    The effective value of the MSR will be 0 if PDCM is clear, however.

    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/kvm/vmx/pmu_intel.c | 16 ++++++++++------
    1 file changed, 10 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c
    index bd70c1d7f345..b3ca19682975 100644
    --- a/arch/x86/kvm/vmx/pmu_intel.c
    +++ b/arch/x86/kvm/vmx/pmu_intel.c
    @@ -153,12 +153,17 @@ static struct kvm_pmc *intel_rdpmc_ecx_to_pmc(struct kvm_vcpu *vcpu,
    return &counters[array_index_nospec(idx, num_counters)];
    }

    -static inline bool fw_writes_is_enabled(struct kvm_vcpu *vcpu)
    +static inline u64 vcpu_get_perf_capabilities(struct kvm_vcpu *vcpu)
    {
    if (!guest_cpuid_has(vcpu, X86_FEATURE_PDCM))
    - return false;
    + return 0;

    - return vcpu->arch.perf_capabilities & PMU_CAP_FW_WRITES;
    + return vcpu->arch.perf_capabilities;
    +}
    +
    +static inline bool fw_writes_is_enabled(struct kvm_vcpu *vcpu)
    +{
    + return (vcpu_get_perf_capabilities(vcpu) & PMU_CAP_FW_WRITES) != 0;
    }

    static inline struct kvm_pmc *get_fw_gp_pmc(struct kvm_pmu *pmu, u32 msr)
    @@ -328,7 +333,6 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
    pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
    pmu->version = 0;
    pmu->reserved_bits = 0xffffffff00200000ull;
    - vcpu->arch.perf_capabilities = 0;

    entry = kvm_find_cpuid_entry(vcpu, 0xa, 0);
    if (!entry)
    @@ -341,8 +345,6 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
    return;

    perf_get_x86_pmu_capability(&x86_pmu);
    - if (guest_cpuid_has(vcpu, X86_FEATURE_PDCM))
    - vcpu->arch.perf_capabilities = vmx_get_perf_capabilities();

    pmu->nr_arch_gp_counters = min_t(int, eax.split.num_counters,
    x86_pmu.num_counters_gp);
    @@ -406,6 +408,8 @@ static void intel_pmu_init(struct kvm_vcpu *vcpu)
    pmu->fixed_counters[i].idx = i + INTEL_PMC_IDX_FIXED;
    pmu->fixed_counters[i].current_config = 0;
    }
    +
    + vcpu->arch.perf_capabilities = vmx_get_perf_capabilities();
    }

    static void intel_pmu_reset(struct kvm_vcpu *vcpu)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-19 18:49    [W:7.433 / U:1.560 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site