Skip to content

Commit b98cc3f

Browse files
sean-jcMa Wupeng
authored andcommitted
KVM: x86/pmu: Zero out PMU metadata on AMD if PMU is disabled
stable inclusion from stable-v6.6.30 commit 6393087d931d055811ed69e85c5782f4b982be0d bugzilla: https://gitee.com/openeuler/kernel/issues/I9MPZ8 Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=6393087d931d055811ed69e85c5782f4b982be0d -------------------------------- [ Upstream commit f933b88e20150f15787390e2a1754a7e412754ed ] Move the purging of common PMU metadata from intel_pmu_refresh() to kvm_pmu_refresh(), and invoke the vendor refresh() hook if and only if the VM is supposed to have a vPMU. KVM already denies access to the PMU based on kvm->arch.enable_pmu, as get_gp_pmc_amd() returns NULL for all PMCs in that case, i.e. KVM already violates AMD's architecture by not virtualizing a PMU (kernels have long since learned to not panic when the PMU is unavailable). But configuring the PMU as if it were enabled causes unwanted side effects, e.g. calls to kvm_pmu_trigger_event() waste an absurd number of cycles due to the all_valid_pmc_idx bitmap being non-zero. Fixes: b1d66da ("KVM: x86/svm: Add module param to control PMU virtualization") Reported-by: Konstantin Khorenko <khorenko@virtuozzo.com> Closes: https://lore.kernel.org/all/20231109180646.2963718-2-khorenko@virtuozzo.com Link: https://lore.kernel.org/r/20231110022857.1273836-2-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com> Stable-dep-of: de120e1d692d ("KVM: x86/pmu: Set enable bits for GP counters in PERF_GLOBAL_CTRL at "RESET"") Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: ZhangPeng <zhangpeng362@huawei.com>
1 parent 837eb65 commit b98cc3f

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

arch/x86/kvm/pmu.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,8 @@ void kvm_pmu_reset(struct kvm_vcpu *vcpu)
691691
*/
692692
void kvm_pmu_refresh(struct kvm_vcpu *vcpu)
693693
{
694+
struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
695+
694696
if (KVM_BUG_ON(kvm_vcpu_has_run(vcpu), vcpu->kvm))
695697
return;
696698

@@ -700,8 +702,22 @@ void kvm_pmu_refresh(struct kvm_vcpu *vcpu)
700702
*/
701703
kvm_pmu_reset(vcpu);
702704

703-
bitmap_zero(vcpu_to_pmu(vcpu)->all_valid_pmc_idx, X86_PMC_IDX_MAX);
704-
static_call(kvm_x86_pmu_refresh)(vcpu);
705+
pmu->version = 0;
706+
pmu->nr_arch_gp_counters = 0;
707+
pmu->nr_arch_fixed_counters = 0;
708+
pmu->counter_bitmask[KVM_PMC_GP] = 0;
709+
pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
710+
pmu->reserved_bits = 0xffffffff00200000ull;
711+
pmu->raw_event_mask = X86_RAW_EVENT_MASK;
712+
pmu->global_ctrl_mask = ~0ull;
713+
pmu->global_status_mask = ~0ull;
714+
pmu->fixed_ctr_ctrl_mask = ~0ull;
715+
pmu->pebs_enable_mask = ~0ull;
716+
pmu->pebs_data_cfg_mask = ~0ull;
717+
bitmap_zero(pmu->all_valid_pmc_idx, X86_PMC_IDX_MAX);
718+
719+
if (vcpu->kvm->arch.enable_pmu)
720+
static_call(kvm_x86_pmu_refresh)(vcpu);
705721
}
706722

707723
void kvm_pmu_init(struct kvm_vcpu *vcpu)

arch/x86/kvm/vmx/pmu_intel.c

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -493,19 +493,6 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
493493
u64 counter_mask;
494494
int i;
495495

496-
pmu->nr_arch_gp_counters = 0;
497-
pmu->nr_arch_fixed_counters = 0;
498-
pmu->counter_bitmask[KVM_PMC_GP] = 0;
499-
pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
500-
pmu->version = 0;
501-
pmu->reserved_bits = 0xffffffff00200000ull;
502-
pmu->raw_event_mask = X86_RAW_EVENT_MASK;
503-
pmu->global_ctrl_mask = ~0ull;
504-
pmu->global_status_mask = ~0ull;
505-
pmu->fixed_ctr_ctrl_mask = ~0ull;
506-
pmu->pebs_enable_mask = ~0ull;
507-
pmu->pebs_data_cfg_mask = ~0ull;
508-
509496
memset(&lbr_desc->records, 0, sizeof(lbr_desc->records));
510497

511498
/*
@@ -517,8 +504,9 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
517504
return;
518505

519506
entry = kvm_find_cpuid_entry(vcpu, 0xa);
520-
if (!entry || !vcpu->kvm->arch.enable_pmu)
507+
if (!entry)
521508
return;
509+
522510
eax.full = entry->eax;
523511
edx.full = entry->edx;
524512

0 commit comments

Comments
 (0)