From: Sean Christopherson <seanjc@google.com>
To: Kan Liang <kan.liang@linux.intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Dapeng Mi <dapeng1.mi@linux.intel.com>,
Jim Mattson <jmattson@google.com>,
Jinrong Liang <cloudliang@tencent.com>,
Aaron Lewis <aaronlewis@google.com>,
Like Xu <likexu@tencent.com>
Subject: Re: [PATCH v7 03/19] KVM: x86/pmu: Remove KVM's enumeration of Intel's architectural encodings
Date: Wed, 8 Nov 2023 11:35:04 -0800 [thread overview]
Message-ID: <ZUvi6P7iKMtsS8wm@google.com> (raw)
In-Reply-To: <4281eee7-6423-4ec8-bb18-c6aeee1faf2c@linux.intel.com>
On Wed, Nov 08, 2023, Kan Liang wrote:
> On 2023-11-07 7:31 p.m., Sean Christopherson wrote:
> > @@ -442,8 +396,29 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
> > return 0;
> > }
> >
> > +/*
> > + * Map fixed counter events to architectural general purpose event encodings.
> > + * Perf doesn't provide APIs to allow KVM to directly program a fixed counter,
> > + * and so KVM instead programs the architectural event to effectively request
> > + * the fixed counter. Perf isn't guaranteed to use a fixed counter and may
> > + * instead program the encoding into a general purpose counter, e.g. if a
> > + * different perf_event is already utilizing the requested counter, but the end
> > + * result is the same (ignoring the fact that using a general purpose counter
> > + * will likely exacerbate counter contention).
> > + *
> > + * Note, reference cycles is counted using a perf-defined "psuedo-encoding",
> > + * as there is no architectural general purpose encoding for reference cycles.
>
> It's not the case for the latest Intel platforms anymore. Please see
> ffbe4ab0beda ("perf/x86/intel: Extend the ref-cycles event to GP counters").
Ugh, yeah. But that and should actually be easier to do on top.
> Maybe perf should export .event_map to KVM somehow.
Oh for ***** sake, perf already does export this for KVM. Untested, but the below
should do the trick. If I need to spin another version of this series then I'll
fold it in, otherwise I'll post it as something on top.
There's also an optimization to be had for kvm_pmu_trigger_event(), which incurs
an indirect branch not only every invocation, but on every iteration. I'll post
this one separately.
diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c
index 5fc5a62af428..a02e13c2e5e6 100644
--- a/arch/x86/kvm/vmx/pmu_intel.c
+++ b/arch/x86/kvm/vmx/pmu_intel.c
@@ -405,25 +405,32 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
* different perf_event is already utilizing the requested counter, but the end
* result is the same (ignoring the fact that using a general purpose counter
* will likely exacerbate counter contention).
- *
- * Note, reference cycles is counted using a perf-defined "psuedo-encoding",
- * as there is no architectural general purpose encoding for reference cycles.
*/
static u64 intel_get_fixed_pmc_eventsel(int index)
{
- const struct {
- u8 eventsel;
- u8 unit_mask;
- } fixed_pmc_events[] = {
- [0] = { 0xc0, 0x00 }, /* Instruction Retired / PERF_COUNT_HW_INSTRUCTIONS. */
- [1] = { 0x3c, 0x00 }, /* CPU Cycles/ PERF_COUNT_HW_CPU_CYCLES. */
- [2] = { 0x00, 0x03 }, /* Reference Cycles / PERF_COUNT_HW_REF_CPU_CYCLES*/
+ enum perf_hw_id perf_id;
+ u64 eventsel;
+
+ BUILD_BUG_ON(KVM_PMC_MAX_FIXED != 3);
+
+ switch (index) {
+ case 0:
+ perf_id = PERF_COUNT_HW_INSTRUCTIONS;
+ break;
+ case 1:
+ perf_id = PERF_COUNT_HW_CPU_CYCLES;
+ break;
+ case 2:
+ perf_id = PERF_COUNT_HW_REF_CPU_CYCLES;
+ break;
+ default:
+ WARN_ON_ONCE(1);
+ return 0;
};
- BUILD_BUG_ON(ARRAY_SIZE(fixed_pmc_events) != KVM_PMC_MAX_FIXED);
-
- return (fixed_pmc_events[index].unit_mask << 8) |
- fixed_pmc_events[index].eventsel;
+ eventsel = perf_get_hw_event_config(perf_id);
+ WARN_ON_ONCE(!eventsel && index < kvm_pmu_cap.num_counters_fixed);
+ return eventsel;
}
static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
next prev parent reply other threads:[~2023-11-08 19:35 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-08 0:31 [PATCH v7 00/19] KVM: x86/pmu: selftests: Fixes and new tests Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 01/19] KVM: x86/pmu: Always treat Fixed counters as available when supported Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 02/19] KVM: x86/pmu: Allow programming events that match unsupported arch events Sean Christopherson
2023-11-08 1:24 ` Jim Mattson
2023-11-08 20:41 ` Liang, Kan
2023-11-08 0:31 ` [PATCH v7 03/19] KVM: x86/pmu: Remove KVM's enumeration of Intel's architectural encodings Sean Christopherson
2023-11-08 16:06 ` Liang, Kan
2023-11-08 19:35 ` Sean Christopherson [this message]
2023-11-08 20:38 ` Liang, Kan
2023-11-08 0:31 ` [PATCH v7 04/19] KVM: x86/pmu: Setup fixed counters' eventsel during PMU initialization Sean Christopherson
2023-11-08 1:28 ` Jim Mattson
2023-11-08 14:39 ` Sean Christopherson
2023-11-08 19:00 ` Jim Mattson
2023-11-08 0:31 ` [PATCH v7 05/19] KVM: selftests: Add vcpu_set_cpuid_property() to set properties Sean Christopherson
2023-11-08 19:11 ` Jim Mattson
2023-11-08 0:31 ` [PATCH v7 06/19] KVM: selftests: Drop the "name" param from KVM_X86_PMU_FEATURE() Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 07/19] KVM: selftests: Extend {kvm,this}_pmu_has() to support fixed counters Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 08/19] KVM: selftests: Add pmu.h and lib/pmu.c for common PMU assets Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 09/19] KVM: selftests: Test Intel PMU architectural events on gp counters Sean Christopherson
2023-11-09 7:28 ` Mi, Dapeng
2023-11-08 0:31 ` [PATCH v7 10/19] KVM: selftests: Test Intel PMU architectural events on fixed counters Sean Christopherson
2023-11-09 7:30 ` Mi, Dapeng
2023-11-09 15:23 ` Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 11/19] KVM: selftests: Test consistency of CPUID with num of gp counters Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 12/19] KVM: selftests: Test consistency of CPUID with num of fixed counters Sean Christopherson
2023-11-09 7:34 ` Mi, Dapeng
2023-11-09 15:19 ` Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 13/19] KVM: selftests: Add functional test for Intel's fixed PMU counters Sean Christopherson
2023-11-09 7:39 ` Mi, Dapeng
2023-11-08 0:31 ` [PATCH v7 14/19] KVM: selftests: Expand PMU counters test to verify LLC events Sean Christopherson
2023-11-09 7:43 ` Mi, Dapeng
2023-11-08 0:31 ` [PATCH v7 15/19] KVM: selftests: Add a helper to query if the PMU module param is enabled Sean Christopherson
2023-11-09 7:45 ` Mi, Dapeng
2023-11-08 0:31 ` [PATCH v7 16/19] KVM: selftests: Add helpers to read integer module params Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 17/19] KVM: selftests: Query module param to detect FEP in MSR filtering test Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 18/19] KVM: selftests: Move KVM_FEP macro into common library header Sean Christopherson
2023-11-08 0:31 ` [PATCH v7 19/19] KVM: selftests: Test PMC virtualization with forced emulation Sean Christopherson
2023-11-09 7:51 ` Mi, Dapeng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZUvi6P7iKMtsS8wm@google.com \
--to=seanjc@google.com \
--cc=aaronlewis@google.com \
--cc=cloudliang@tencent.com \
--cc=dapeng1.mi@linux.intel.com \
--cc=jmattson@google.com \
--cc=kan.liang@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=likexu@tencent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.