From: Sean Christopherson <seanjc@google.com>
To: JinrongLiang <ljr.kernel@gmail.com>
Cc: Jim Mattson <jmattson@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Kan Liang <kan.liang@linux.intel.com>,
Dapeng Mi <dapeng1.mi@linux.intel.com>,
Like Xu <likexu@tencent.com>, Aaron Lewis <aaronlewis@google.com>,
Jinrong Liang <cloudliang@tencent.com>
Subject: Re: [PATCH v6 09/20] KVM: selftests: Add pmu.h and lib/pmu.c for common PMU assets
Date: Mon, 6 Nov 2023 12:40:47 -0800 [thread overview]
Message-ID: <ZUlPT6ed5d0FCLYL@google.com> (raw)
In-Reply-To: <e704b8ef-7488-96f4-27a8-35af722d4a3f@gmail.com>
On Mon, Nov 06, 2023, JinrongLiang wrote:
> 在 2023/11/4 21:20, Jim Mattson 写道:
> > > diff --git a/tools/testing/selftests/kvm/include/pmu.h b/tools/testing/selftests/kvm/include/pmu.h
> > > new file mode 100644
> > > index 000000000000..987602c62b51
> > > --- /dev/null
> > > +++ b/tools/testing/selftests/kvm/include/pmu.h
> > > @@ -0,0 +1,84 @@
> > > +/* SPDX-License-Identifier: GPL-2.0-only */
> > > +/*
> > > + * Copyright (C) 2023, Tencent, Inc.
> > > + */
> > > +#ifndef SELFTEST_KVM_PMU_H
> > > +#define SELFTEST_KVM_PMU_H
> > > +
> > > +#include <stdint.h>
> > > +
> > > +#define X86_PMC_IDX_MAX 64
> > > +#define INTEL_PMC_MAX_GENERIC 32
> >
> > I think this is actually 15. Note that IA32_PMC0 through IA32_PMC7
> > have MSR indices from 0xc1 through 0xc8, and MSR 0xcf is
> > IA32_CORE_CAPABILITIES. At the very least, we have to handle
> > non-contiguous MSR indices if we ever go beyond IA32_PMC14.
There's no reason to define this, it's not used in selftests.
> > > +#define KVM_PMU_EVENT_FILTER_MAX_EVENTS 300
> > > +
> > > +#define GP_COUNTER_NR_OFS_BIT 8
> > > +#define EVENT_LENGTH_OFS_BIT 24
> > > +
> > > +#define PMU_VERSION_MASK GENMASK_ULL(7, 0)
> > > +#define EVENT_LENGTH_MASK GENMASK_ULL(31, EVENT_LENGTH_OFS_BIT)
> > > +#define GP_COUNTER_NR_MASK GENMASK_ULL(15, GP_COUNTER_NR_OFS_BIT)
> > > +#define FIXED_COUNTER_NR_MASK GENMASK_ULL(4, 0)
These are also unneeded, they're superseded by CPUID properties.
> > > +#define ARCH_PERFMON_EVENTSEL_EVENT GENMASK_ULL(7, 0)
> > > +#define ARCH_PERFMON_EVENTSEL_UMASK GENMASK_ULL(15, 8)
> > > +#define ARCH_PERFMON_EVENTSEL_USR BIT_ULL(16)
> > > +#define ARCH_PERFMON_EVENTSEL_OS BIT_ULL(17)
> > > +#define ARCH_PERFMON_EVENTSEL_EDGE BIT_ULL(18)
> > > +#define ARCH_PERFMON_EVENTSEL_PIN_CONTROL BIT_ULL(19)
> > > +#define ARCH_PERFMON_EVENTSEL_INT BIT_ULL(20)
> > > +#define ARCH_PERFMON_EVENTSEL_ANY BIT_ULL(21)
> > > +#define ARCH_PERFMON_EVENTSEL_ENABLE BIT_ULL(22)
> > > +#define ARCH_PERFMON_EVENTSEL_INV BIT_ULL(23)
> > > +#define ARCH_PERFMON_EVENTSEL_CMASK GENMASK_ULL(31, 24)
> > > +
> > > +#define PMC_MAX_FIXED 16
Also unneeded.
> > > +#define PMC_IDX_FIXED 32
This one is absolutely ridiculous. It's the shift for the enable bit in global
control, which is super obvious from the name. /s
> > > +
> > > +/* RDPMC offset for Fixed PMCs */
> > > +#define PMC_FIXED_RDPMC_BASE BIT_ULL(30)
> > > +#define PMC_FIXED_RDPMC_METRICS BIT_ULL(29)
> > > +
> > > +#define FIXED_BITS_MASK 0xFULL
> > > +#define FIXED_BITS_STRIDE 4
> > > +#define FIXED_0_KERNEL BIT_ULL(0)
> > > +#define FIXED_0_USER BIT_ULL(1)
> > > +#define FIXED_0_ANYTHREAD BIT_ULL(2)
> > > +#define FIXED_0_ENABLE_PMI BIT_ULL(3)
> > > +
> > > +#define fixed_bits_by_idx(_idx, _bits) \
> > > + ((_bits) << ((_idx) * FIXED_BITS_STRIDE))
*sigh* And now I see where the "i * 4" stuff in the new test comes from. My
plan is to redo the above as:
/* RDPMC offset for Fixed PMCs */
#define FIXED_PMC_RDPMC_METRICS BIT_ULL(29)
#define FIXED_PMC_RDPMC_BASE BIT_ULL(30)
#define FIXED_PMC_GLOBAL_CTRL_ENABLE(_idx) BIT_ULL((32 + (_idx)))
#define FIXED_PMC_KERNEL BIT_ULL(0)
#define FIXED_PMC_USER BIT_ULL(1)
#define FIXED_PMC_ANYTHREAD BIT_ULL(2)
#define FIXED_PMC_ENABLE_PMI BIT_ULL(3)
#define FIXED_PMC_NR_BITS 4
#define FIXED_PMC_CTRL(_idx, _val) ((_val) << ((_idx) * FIXED_PMC_NR_BITS))
> > > +#define AMD64_NR_COUNTERS 4
> > > +#define AMD64_NR_COUNTERS_CORE 6
These too can be dropped for now.
> > > +#define PMU_CAP_FW_WRITES BIT_ULL(13)
> > > +#define PMU_CAP_LBR_FMT 0x3f
> > > +
> > > +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_INTEL_ARCH_EVENTS,
> > > +};
> > > +
> > > +enum amd_pmu_k7_events {
> > > + AMD_ZEN_CORE_CYCLES,
> > > + AMD_ZEN_INSTRUCTIONS,
> > > + AMD_ZEN_BRANCHES,
> > > + AMD_ZEN_BRANCH_MISSES,
> > > + NR_AMD_ARCH_EVENTS,
> > > +};
> > > +
> > > +extern const uint64_t intel_pmu_arch_events[];
> > > +extern const uint64_t amd_pmu_arch_events[];
> >
> > AMD doesn't define *any* architectural events. Perhaps
> > amd_pmu_zen_events[], though who knows what Zen5 and beyond will
> > bring?
> >
> > > +extern const int intel_pmu_fixed_pmc_events[];
> > > +
> > > +#endif /* SELFTEST_KVM_PMU_H */
> > > diff --git a/tools/testing/selftests/kvm/lib/pmu.c b/tools/testing/selftests/kvm/lib/pmu.c
> > > new file mode 100644
> > > index 000000000000..27a6c35f98a1
> > > --- /dev/null
> > > +++ b/tools/testing/selftests/kvm/lib/pmu.c
> > > @@ -0,0 +1,28 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +/*
> > > + * Copyright (C) 2023, Tencent, Inc.
> > > + */
> > > +
> > > +#include <stdint.h>
> > > +
> > > +#include "pmu.h"
> > > +
> > > +/* Definitions for Architectural Performance Events */
> > > +#define ARCH_EVENT(select, umask) (((select) & 0xff) | ((umask) & 0xff) << 8)
> >
> > There's nothing architectural about this. Perhaps RAW_EVENT() for
> > consistency with perf?
Works for me.
> > > +const uint64_t intel_pmu_arch_events[] = {
> > > + [INTEL_ARCH_CPU_CYCLES] = ARCH_EVENT(0x3c, 0x0),
> > > + [INTEL_ARCH_INSTRUCTIONS_RETIRED] = ARCH_EVENT(0xc0, 0x0),
> > > + [INTEL_ARCH_REFERENCE_CYCLES] = ARCH_EVENT(0x3c, 0x1),
> > > + [INTEL_ARCH_LLC_REFERENCES] = ARCH_EVENT(0x2e, 0x4f),
> > > + [INTEL_ARCH_LLC_MISSES] = ARCH_EVENT(0x2e, 0x41),
> > > + [INTEL_ARCH_BRANCHES_RETIRED] = ARCH_EVENT(0xc4, 0x0),
> > > + [INTEL_ARCH_BRANCHES_MISPREDICTED] = ARCH_EVENT(0xc5, 0x0),
> >
> > [INTEL_ARCH_TOPDOWN_SLOTS] = ARCH_EVENT(0xa4, 1),
...
> > > @@ -63,7 +50,6 @@
> > >
> > > #define AMD_ZEN_BR_RETIRED EVENT(0xc2, 0)
> >
> > Now AMD_ZEN_BRANCHES, above?
>
> Yes, I forgot to replace INTEL_BR_RETIRED, AMD_ZEN_BR_RETIRED and
> INST_RETIRED in pmu_event_filter_test.c and remove their macro definitions.
Having to go through an array to get a hardcoded value is silly, e.g. it makes
it unnecessarily difficult to reference the encodings because they aren't simple
literals.
My vote is this:
#define INTEL_ARCH_CPU_CYCLES RAW_EVENT(0x3c, 0x00)
#define INTEL_ARCH_INSTRUCTIONS_RETIRED RAW_EVENT(0xc0, 0x00)
#define INTEL_ARCH_REFERENCE_CYCLES RAW_EVENT(0x3c, 0x01)
#define INTEL_ARCH_LLC_REFERENCES RAW_EVENT(0x2e, 0x4f)
#define INTEL_ARCH_LLC_MISSES RAW_EVENT(0x2e, 0x41)
#define INTEL_ARCH_BRANCHES_RETIRED RAW_EVENT(0xc4, 0x00)
#define INTEL_ARCH_BRANCHES_MISPREDICTED RAW_EVENT(0xc5, 0x00)
#define INTEL_ARCH_TOPDOWN_SLOTS RAW_EVENT(0xa4, 0x01)
#define AMD_ZEN_CORE_CYCLES RAW_EVENT(0x76, 0x00)
#define AMD_ZEN_INSTRUCTIONS_RETIRED RAW_EVENT(0xc0, 0x00)
#define AMD_ZEN_BRANCHES_RETIRED RAW_EVENT(0xc2, 0x00)
#define AMD_ZEN_BRANCHES_MISPREDICTED RAW_EVENT(0xc3, 0x00)
/*
* Note! The order and thus the index of the architectural events matters as
* support for each event is enumerated via CPUID using the index of the event.
*/
enum intel_pmu_architectural_events {
INTEL_ARCH_CPU_CYCLES_INDEX,
INTEL_ARCH_INSTRUCTIONS_RETIRED_INDEX,
INTEL_ARCH_REFERENCE_CYCLES_INDEX,
INTEL_ARCH_LLC_REFERENCES_INDEX,
INTEL_ARCH_LLC_MISSES_INDEX,
INTEL_ARCH_BRANCHES_RETIRED_INDEX,
INTEL_ARCH_BRANCHES_MISPREDICTED_INDEX,
INTEL_ARCH_TOPDOWN_SLOTS_INDEX,
NR_INTEL_ARCH_EVENTS,
};
enum amd_pmu_zen_events {
AMD_ZEN_CORE_CYCLES_INDEX,
AMD_ZEN_INSTRUCTIONS_INDEX,
AMD_ZEN_BRANCHES_INDEX,
AMD_ZEN_BRANCH_MISSES_INDEX,
NR_AMD_ZEN_EVENTS,
};
extern const uint64_t intel_pmu_arch_events[];
extern const uint64_t amd_pmu_zen_events[];
...
const uint64_t intel_pmu_arch_events[] = {
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,
INTEL_ARCH_TOPDOWN_SLOTS,
};
kvm_static_assert(ARRAY_SIZE(intel_pmu_arch_events) == NR_INTEL_ARCH_EVENTS);
const uint64_t amd_pmu_zen_events[] = {
AMD_ZEN_CORE_CYCLES,
AMD_ZEN_INSTRUCTIONS_RETIRED,
AMD_ZEN_BRANCHES_RETIRED,
AMD_ZEN_BRANCHES_MISPREDICTED,
};
kvm_static_assert(ARRAY_SIZE(amd_pmu_zen_events) == NR_AMD_ZEN_EVENTS);
next prev parent reply other threads:[~2023-11-06 20:40 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-04 0:02 [PATCH v6 00/20] KVM: x86/pmu: selftests: Fixes and new tests Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 01/20] KVM: x86/pmu: Don't allow exposing unsupported architectural events Sean Christopherson
2023-11-04 12:08 ` Jim Mattson
2023-11-06 14:43 ` Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 02/20] KVM: x86/pmu: Don't enumerate support for fixed counters KVM can't virtualize Sean Christopherson
2023-11-04 12:25 ` Jim Mattson
2023-11-06 15:31 ` Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 03/20] KVM: x86/pmu: Don't enumerate arch events KVM doesn't support Sean Christopherson
2023-11-04 12:41 ` Jim Mattson
2023-11-07 7:14 ` Mi, Dapeng
2023-11-07 17:27 ` Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 04/20] KVM: x86/pmu: Always treat Fixed counters as available when supported Sean Christopherson
2023-11-04 12:43 ` Jim Mattson
2023-11-04 0:02 ` [PATCH v6 05/20] KVM: x86/pmu: Allow programming events that match unsupported arch events Sean Christopherson
2023-11-04 12:46 ` Jim Mattson
2023-11-07 7:15 ` Mi, Dapeng
2023-11-04 0:02 ` [PATCH v6 06/20] KVM: selftests: Add vcpu_set_cpuid_property() to set properties Sean Christopherson
2023-11-04 12:51 ` Jim Mattson
2023-11-06 19:01 ` Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 07/20] KVM: selftests: Drop the "name" param from KVM_X86_PMU_FEATURE() Sean Christopherson
2023-11-04 12:52 ` Jim Mattson
2023-11-04 0:02 ` [PATCH v6 08/20] KVM: selftests: Extend {kvm,this}_pmu_has() to support fixed counters Sean Christopherson
2023-11-04 13:00 ` Jim Mattson
2023-11-06 19:50 ` Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 09/20] KVM: selftests: Add pmu.h and lib/pmu.c for common PMU assets Sean Christopherson
2023-11-04 13:20 ` Jim Mattson
2023-11-06 7:19 ` JinrongLiang
2023-11-06 20:40 ` Sean Christopherson [this message]
2023-11-07 10:51 ` Jinrong Liang
2023-11-04 0:02 ` [PATCH v6 10/20] KVM: selftests: Test Intel PMU architectural events on gp counters Sean Christopherson
2023-11-04 13:29 ` Jim Mattson
2023-11-04 0:02 ` [PATCH v6 11/20] KVM: selftests: Test Intel PMU architectural events on fixed counters Sean Christopherson
2023-11-04 13:46 ` Jim Mattson
2023-11-06 16:39 ` Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 12/20] KVM: selftests: Test consistency of CPUID with num of gp counters Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 13/20] KVM: selftests: Test consistency of CPUID with num of fixed counters Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 14/20] KVM: selftests: Add functional test for Intel's fixed PMU counters Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 15/20] KVM: selftests: Expand PMU counters test to verify LLC events Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 16/20] KVM: selftests: Add a helper to query if the PMU module param is enabled Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 17/20] KVM: selftests: Add helpers to read integer module params Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 18/20] KVM: selftests: Query module param to detect FEP in MSR filtering test Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 19/20] KVM: selftests: Move KVM_FEP macro into common library header Sean Christopherson
2023-11-04 0:02 ` [PATCH v6 20/20] KVM: selftests: Test PMC virtualization with forced emulation 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=ZUlPT6ed5d0FCLYL@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=ljr.kernel@gmail.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox