From: Like Xu <like.xu.linux@gmail.com>
To: Sean Christopherson <seanjc@google.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Aaron Lewis <aaronlewis@google.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH 1/4] KVM: x86/pmu: Use enums instead of hardcoded magic for arch event indices
Date: Mon, 10 Jul 2023 18:50:14 +0800 [thread overview]
Message-ID: <6def6249-bd36-875c-6faf-e4685b8c3fde@gmail.com> (raw)
In-Reply-To: <20230607010206.1425277-2-seanjc@google.com>
On 7/6/2023 9:02 am, Sean Christopherson wrote:
> Add "enum intel_pmu_architectural_events" to replace the magic numbers for
> the (pseudo-)architectural events, and to give a meaningful name to each
> event so that new readers don't need psychic powers to understand what the
> code is doing.
>
> Cc: Aaron Lewis <aaronlewis@google.com>
> Cc: Like Xu <like.xu.linux@gmail.com>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Like Xu <likexu@tencent.com>
// I should have done it. Thanks.
> ---
> arch/x86/kvm/vmx/pmu_intel.c | 55 ++++++++++++++++++++++++++++--------
> 1 file changed, 43 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c
> index 84be32d9f365..0050d71c9c01 100644
> --- a/arch/x86/kvm/vmx/pmu_intel.c
> +++ b/arch/x86/kvm/vmx/pmu_intel.c
> @@ -22,23 +22,51 @@
>
> #define MSR_PMC_FULL_WIDTH_BIT (MSR_IA32_PMC0 - MSR_IA32_PERFCTR0)
>
> +enum intel_pmu_architectural_events {
> + /*
> + * The order of the architectural events matters as support for each
> + * event is enumerated via CPUID using the index of the event.
> + */
> + INTEL_ARCH_CPU_CYCLES,
> + INTEL_ARCH_INSTRUCTIONS_RETIRED,
> + INTEL_ARCH_REFERENCE_CYCLES,
> + INTEL_ARCH_LLC_REFERENCES,
> + INTEL_ARCH_LLC_MISSES,
> + INTEL_ARCH_BRANCHES_RETIRED,
> + INTEL_ARCH_BRANCHES_MISPREDICTED,
> +
> + NR_REAL_INTEL_ARCH_EVENTS,
> +
> + /*
> + * Pseudo-architectural event used to implement IA32_FIXED_CTR2, a.k.a.
> + * TSC reference cycles. The architectural reference cycles event may
> + * or may not actually use the TSC as the reference, e.g. might use the
> + * core crystal clock or the bus clock (yeah, "architectural").
> + */
> + PSEUDO_ARCH_REFERENCE_CYCLES = NR_REAL_INTEL_ARCH_EVENTS,
> + NR_INTEL_ARCH_EVENTS,
> +};
> +
> static struct {
> u8 eventsel;
> u8 unit_mask;
> } const intel_arch_events[] = {
> - [0] = { 0x3c, 0x00 },
> - [1] = { 0xc0, 0x00 },
> - [2] = { 0x3c, 0x01 },
> - [3] = { 0x2e, 0x4f },
> - [4] = { 0x2e, 0x41 },
> - [5] = { 0xc4, 0x00 },
> - [6] = { 0xc5, 0x00 },
> - /* The above index must match CPUID 0x0A.EBX bit vector */
> - [7] = { 0x00, 0x03 },
> + [INTEL_ARCH_CPU_CYCLES] = { 0x3c, 0x00 },
> + [INTEL_ARCH_INSTRUCTIONS_RETIRED] = { 0xc0, 0x00 },
> + [INTEL_ARCH_REFERENCE_CYCLES] = { 0x3c, 0x01 },
> + [INTEL_ARCH_LLC_REFERENCES] = { 0x2e, 0x4f },
> + [INTEL_ARCH_LLC_MISSES] = { 0x2e, 0x41 },
> + [INTEL_ARCH_BRANCHES_RETIRED] = { 0xc4, 0x00 },
> + [INTEL_ARCH_BRANCHES_MISPREDICTED] = { 0xc5, 0x00 },
> + [PSEUDO_ARCH_REFERENCE_CYCLES] = { 0x00, 0x03 },
> };
>
> /* mapping between fixed pmc index and intel_arch_events array */
> -static int fixed_pmc_events[] = {1, 0, 7};
> +static int fixed_pmc_events[] = {
> + [0] = INTEL_ARCH_INSTRUCTIONS_RETIRED,
> + [1] = INTEL_ARCH_CPU_CYCLES,
> + [2] = PSEUDO_ARCH_REFERENCE_CYCLES,
> +};
>
> static void reprogram_fixed_counters(struct kvm_pmu *pmu, u64 data)
> {
> @@ -92,13 +120,16 @@ static bool intel_hw_event_available(struct kvm_pmc *pmc)
> u8 unit_mask = (pmc->eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8;
> int i;
>
> - for (i = 0; i < ARRAY_SIZE(intel_arch_events); i++) {
> + BUILD_BUG_ON(ARRAY_SIZE(intel_arch_events) != NR_INTEL_ARCH_EVENTS);
> +
> + for (i = 0; i < NR_INTEL_ARCH_EVENTS; i++) {
> if (intel_arch_events[i].eventsel != event_select ||
> intel_arch_events[i].unit_mask != unit_mask)
> continue;
>
> /* disable event that reported as not present by cpuid */
> - if ((i < 7) && !(pmu->available_event_types & (1 << i)))
> + if ((i < PSEUDO_ARCH_REFERENCE_CYCLES) &&
> + !(pmu->available_event_types & (1 << i)))
CHECK: Unnecessary parentheses around 'i < PSEUDO_ARCH_REFERENCE_CYCLES'
#164: FILE: arch/x86/kvm/vmx/pmu_intel.c:131:
+ if ((i < PSEUDO_ARCH_REFERENCE_CYCLES) &&
+ !(pmu->available_event_types & (1 << i)))
> return false;
>
> break;
next prev parent reply other threads:[~2023-07-10 10:50 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-07 1:02 [PATCH 0/4] KVM: x86/pmu: Clean up arch/hw event handling Sean Christopherson
2023-06-07 1:02 ` [PATCH 1/4] KVM: x86/pmu: Use enums instead of hardcoded magic for arch event indices Sean Christopherson
2023-07-10 10:50 ` Like Xu [this message]
2023-06-07 1:02 ` [PATCH 2/4] KVM: x86/pmu: Simplify intel_hw_event_available() Sean Christopherson
2023-06-07 1:02 ` [PATCH 3/4] KVM: x86/pmu: Require nr fixed_pmc_events to match nr max fixed counters Sean Christopherson
2023-06-07 1:02 ` [PATCH 4/4] KVM: x86/pmu: Move .hw_event_available() check out of PMC filter helper Sean Christopherson
2023-07-11 16:32 ` Like Xu
2023-07-12 16:11 ` Sean Christopherson
2023-08-03 0:05 ` [PATCH 0/4] KVM: x86/pmu: Clean up arch/hw event handling Sean Christopherson
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=6def6249-bd36-875c-6faf-e4685b8c3fde@gmail.com \
--to=like.xu.linux@gmail.com \
--cc=aaronlewis@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.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.