KVM: x86/pmu: Add common define to capture fixed counters offset
authorSean Christopherson <seanjc@google.com>
Fri, 10 Nov 2023 02:28:49 +0000 (18:28 -0800)
committerSean Christopherson <seanjc@google.com>
Thu, 1 Feb 2024 17:34:31 +0000 (09:34 -0800)
Add a common define to "officially" solidify KVM's split of counters,
i.e. to commit to using bits 31:0 to track general purpose counters and
bits 63:32 to track fixed counters (which only Intel supports).  KVM
already bleeds this behavior all over common PMU code, and adding a KVM-
defined macro allows clarifying that the value is a _base_, as oppposed to
the _flag_ that is used to access fixed PMCs via RDPMC (which perf
confusingly calls INTEL_PMC_FIXED_RDPMC_BASE).

No functional change intended.

Link: https://lore.kernel.org/r/20231110022857.1273836-3-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/pmu.c
arch/x86/kvm/pmu.h
arch/x86/kvm/vmx/pmu_intel.c

index 4d4366c6f7cd4d59d90730008707936a79c45e49..67d589ac9363d4c9be7d41d0dda5d47051b2048a 100644 (file)
@@ -67,7 +67,7 @@ static const struct x86_cpu_id vmx_pebs_pdist_cpu[] = {
  *        all perf counters (both gp and fixed). The mapping relationship
  *        between pmc and perf counters is as the following:
  *        * Intel: [0 .. KVM_INTEL_PMC_MAX_GENERIC-1] <=> gp counters
- *                 [INTEL_PMC_IDX_FIXED .. INTEL_PMC_IDX_FIXED + 2] <=> fixed
+ *                 [KVM_FIXED_PMC_BASE_IDX .. KVM_FIXED_PMC_BASE_IDX + 2] <=> fixed
  *        * AMD:   [0 .. AMD64_NUM_COUNTERS-1] and, for families 15H
  *          and later, [0 .. AMD64_NUM_COUNTERS_CORE-1] <=> gp counters
  */
@@ -411,7 +411,7 @@ static bool is_gp_event_allowed(struct kvm_x86_pmu_event_filter *f,
 static bool is_fixed_event_allowed(struct kvm_x86_pmu_event_filter *filter,
                                   int idx)
 {
-       int fixed_idx = idx - INTEL_PMC_IDX_FIXED;
+       int fixed_idx = idx - KVM_FIXED_PMC_BASE_IDX;
 
        if (filter->action == KVM_PMU_EVENT_DENY &&
            test_bit(fixed_idx, (ulong *)&filter->fixed_counter_bitmap))
@@ -465,7 +465,7 @@ static void reprogram_counter(struct kvm_pmc *pmc)
 
        if (pmc_is_fixed(pmc)) {
                fixed_ctr_ctrl = fixed_ctrl_field(pmu->fixed_ctr_ctrl,
-                                                 pmc->idx - INTEL_PMC_IDX_FIXED);
+                                                 pmc->idx - KVM_FIXED_PMC_BASE_IDX);
                if (fixed_ctr_ctrl & 0x1)
                        eventsel |= ARCH_PERFMON_EVENTSEL_OS;
                if (fixed_ctr_ctrl & 0x2)
@@ -841,7 +841,7 @@ static inline bool cpl_is_matched(struct kvm_pmc *pmc)
                select_user = config & ARCH_PERFMON_EVENTSEL_USR;
        } else {
                config = fixed_ctrl_field(pmc_to_pmu(pmc)->fixed_ctr_ctrl,
-                                         pmc->idx - INTEL_PMC_IDX_FIXED);
+                                         pmc->idx - KVM_FIXED_PMC_BASE_IDX);
                select_os = config & 0x1;
                select_user = config & 0x2;
        }
index 51bbb01b21c878b606f6f03cdbadb6614d40a66e..e8c6a1f4b8e8715551e752849a8f0033432b5db5 100644 (file)
@@ -18,6 +18,8 @@
 #define VMWARE_BACKDOOR_PMC_REAL_TIME          0x10001
 #define VMWARE_BACKDOOR_PMC_APPARENT_TIME      0x10002
 
+#define KVM_FIXED_PMC_BASE_IDX INTEL_PMC_IDX_FIXED
+
 struct kvm_pmu_ops {
        struct kvm_pmc *(*pmc_idx_to_pmc)(struct kvm_pmu *pmu, int pmc_idx);
        struct kvm_pmc *(*rdpmc_ecx_to_pmc)(struct kvm_vcpu *vcpu,
@@ -130,7 +132,7 @@ static inline bool pmc_speculative_in_use(struct kvm_pmc *pmc)
 
        if (pmc_is_fixed(pmc))
                return fixed_ctrl_field(pmu->fixed_ctr_ctrl,
-                                       pmc->idx - INTEL_PMC_IDX_FIXED) & 0x3;
+                                       pmc->idx - KVM_FIXED_PMC_BASE_IDX) & 0x3;
 
        return pmc->eventsel & ARCH_PERFMON_EVENTSEL_ENABLE;
 }
index a87f4725a9bedc069192a71fcce65d7194b2fa7c..fe7a2ba51e1be3223b1beef760a51a4e1b2d431a 100644 (file)
@@ -50,18 +50,18 @@ static void reprogram_fixed_counters(struct kvm_pmu *pmu, u64 data)
 
                pmc = get_fixed_pmc(pmu, MSR_CORE_PERF_FIXED_CTR0 + i);
 
-               __set_bit(INTEL_PMC_IDX_FIXED + i, pmu->pmc_in_use);
+               __set_bit(KVM_FIXED_PMC_BASE_IDX + i, pmu->pmc_in_use);
                kvm_pmu_request_counter_reprogram(pmc);
        }
 }
 
 static struct kvm_pmc *intel_pmc_idx_to_pmc(struct kvm_pmu *pmu, int pmc_idx)
 {
-       if (pmc_idx < INTEL_PMC_IDX_FIXED) {
+       if (pmc_idx < KVM_FIXED_PMC_BASE_IDX) {
                return get_gp_pmc(pmu, MSR_P6_EVNTSEL0 + pmc_idx,
                                  MSR_P6_EVNTSEL0);
        } else {
-               u32 idx = pmc_idx - INTEL_PMC_IDX_FIXED;
+               u32 idx = pmc_idx - KVM_FIXED_PMC_BASE_IDX;
 
                return get_fixed_pmc(pmu, idx + MSR_CORE_PERF_FIXED_CTR0);
        }
@@ -516,7 +516,7 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
        for (i = 0; i < pmu->nr_arch_fixed_counters; i++)
                pmu->fixed_ctr_ctrl_mask &= ~(0xbull << (i * 4));
        counter_mask = ~(((1ull << pmu->nr_arch_gp_counters) - 1) |
-               (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED));
+               (((1ull << pmu->nr_arch_fixed_counters) - 1) << KVM_FIXED_PMC_BASE_IDX));
        pmu->global_ctrl_mask = counter_mask;
 
        /*
@@ -560,7 +560,7 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
                        pmu->reserved_bits &= ~ICL_EVENTSEL_ADAPTIVE;
                        for (i = 0; i < pmu->nr_arch_fixed_counters; i++) {
                                pmu->fixed_ctr_ctrl_mask &=
-                                       ~(1ULL << (INTEL_PMC_IDX_FIXED + i * 4));
+                                       ~(1ULL << (KVM_FIXED_PMC_BASE_IDX + i * 4));
                        }
                        pmu->pebs_data_cfg_mask = ~0xff00000full;
                } else {
@@ -586,7 +586,7 @@ static void intel_pmu_init(struct kvm_vcpu *vcpu)
        for (i = 0; i < KVM_PMC_MAX_FIXED; i++) {
                pmu->fixed_counters[i].type = KVM_PMC_FIXED;
                pmu->fixed_counters[i].vcpu = vcpu;
-               pmu->fixed_counters[i].idx = i + INTEL_PMC_IDX_FIXED;
+               pmu->fixed_counters[i].idx = i + KVM_FIXED_PMC_BASE_IDX;
                pmu->fixed_counters[i].current_config = 0;
                pmu->fixed_counters[i].eventsel = intel_get_fixed_pmc_eventsel(i);
        }