mbox series

[v2,0/9] Upgrade intel vPMU version to 5

Message ID 20230921082957.44628-1-xiong.y.zhang@intel.com (mailing list archive)
Headers show
Series Upgrade intel vPMU version to 5 | expand

Message

Zhang, Xiong Y Sept. 21, 2023, 8:29 a.m. UTC
Intel recent processors have supported Architectural Performance
Monitoring Version 5, while Intel vPMU still keeps on version 2. In order
to use new PMU features introduced in version 4 and 5, this patchset
upgrades vPMU version to 5.

Go through PMU features from version 3 to 5, the following features are
supported by this patchset:
1. Streamlined Freeze LBR on PMI on version 4. This feature adds a new
bit IA32_MSR_PERF_GLOBAL_STATUS.LBR_FRZ[58], it will be set when PMI
happens and LBR stack is forzen. This bit also serves as a control to
enable LBR stack. SW should clear this bit at the end of PMI handler
to enable LBR stack.
2. IA32_PERF_GLOBAL_STATUS_RESET MSR on version 4. its address is
inherited from  IA32_PERF_GLOBAL_OVF_CTRL MSR, and they have the same
function to clear individual bits in IA32_PERF_GLOBAL_STATUS MSR.
3. IA32_PERF_GLOBAL_STATUS_SET MSR on version 4. it allows software to
set individual bits in IA32_PERF_GLOBAL_STATUS MSR.
4. IA32_PERF_GLOBAL_INUSE MSR on version 4. It provides an "InUse" bit
for each programmable performance counter and fixed counter in the
processor. Additionally, it includes an indicator if the PMI mechanisam
has been used.
5. Fixed Counter Enumeration on version 5. CPUID.0AH.ECX provides a bit
mask which enumerates the supported Fixed Counters in a processor.

For each added feature, the kvm emulation is straightforward and reflects
vPMU state, please see each feature's emulation code in the following
commits, a kvm unit test case or kernel selftests is added to verify
this feature's emultion. Kernel doesn't use feature 3 and 4, so
designed kvm unit test case is the only verification method for
feature 3 and 4. I'm afraid that I miss something for these features,
especially the user case for these features.

While the following features are not supported:
1. AnyThread counting: it is added in v3, and deprecated in v5. so this
feature isn't supported.
2. Streamlined Freeze_PerfMon_On_PMI on version 4. Since legacy
Freeze_PerMon_On_PMI on version 2 isn't supported and community think
this feature has problems on native[1], so this feature's emulation
isn't supported.
3. IA32_PERF_GLOBAL_STATUS.ASCI[bit 60] on version 4. This new bit
relates to SGX, and will be emulated by SGX developer.
4. Domain Seperation on version 5. When INV flag in IA32_PERFEVTSELx is
used, a counter stops counting when logical processor exits the C0 ACPI
C-state. Guest ACPI C-state is vague, KVM has little information about
guest ACPI C-state. So this feature's emulation isn't supported.

Changes since v1:
* vLBR release bug not only happens in Freeze_LBR_On_PMI, but also happens
  on generic case. So the first commit fixes this bug. (Like Xu)
* Add new PERF_GLOBAL_STATUS_SET and PERF_GLOBAL_STATUS_INUSE MSRs into
  msrs_to_save_pmu[] (Like Xu)
* If INUSE_PMI bit is set, no need to write it again. (Like Xu)
* Get Fixed Counter enumeration from host for nested vPMU, but I marked it
  as Todo to wait for perf driver fixed counter bitmap supporting.

Reference:
[1]: perf/intel: Remove Perfmon-v4 counter_freezing support
https://lore.kernel.org/all/20201110153721.GQ2651@hirez.programming.kicks-ass.net/

Like Xu (1):
  KVM: x86/pmu: Add Intel PMU supported fixed counters mask

Xiong Zhang (8):
  KVM: x86/PMU: Delay vLBR release to the vcpu next sched-in
  KVM: x86/pmu: Don't release vLBR casued by vPMI
  KVM: x85/pmu: Add Streamlined FREEZE_LBR_ON_PMI for vPMU v4
  KVM: x86/pmu: Add PERF_GLOBAL_STATUS_SET MSR emulation
  KVM: x86/pmu: Add MSR_CORE_PERF_GLOBAL_INUSE emulation
  KVM: x86/pmu: Add fixed counter enumeration for pmu v5
  KVM: x86/pmu: Upgrade pmu version to 5 on intel processor
  KVM: selftests: Add fixed counters enumeration test case

 arch/x86/include/asm/kvm_host.h               |   1 -
 arch/x86/include/asm/msr-index.h              |   6 +
 arch/x86/kvm/cpuid.c                          |  10 +-
 arch/x86/kvm/pmu.c                            |   8 -
 arch/x86/kvm/pmu.h                            |  14 +-
 arch/x86/kvm/svm/pmu.c                        |   1 -
 arch/x86/kvm/vmx/pmu_intel.c                  | 205 +++++++++++++++---
 arch/x86/kvm/vmx/vmx.c                        |  19 +-
 arch/x86/kvm/vmx/vmx.h                        |   8 +
 arch/x86/kvm/x86.c                            |   1 +
 .../selftests/kvm/x86_64/vmx_pmu_caps_test.c  |  79 +++++++
 11 files changed, 308 insertions(+), 44 deletions(-)


base-commit: 0bb80ecc33a8fb5a682236443c1e740d5c917d1d