From: Alexandru Elisei <alexandru.elisei@arm.com>
To: Eric Auger <eric.auger@redhat.com>
Cc: eric.auger.pro@gmail.com, kvm@vger.kernel.org,
kvmarm@lists.linux.dev, andrew.jones@linux.dev, maz@kernel.org,
will@kernel.org, oliver.upton@linux.dev, ricarkol@google.com,
reijiw@google.com
Subject: Re: [kvm-unit-tests PATCH 5/6] arm: pmu: Add pmu-memaccess-reliability test
Date: Fri, 21 Apr 2023 12:13:28 +0100 [thread overview]
Message-ID: <ZEJv2EINBwNRjBa6@monolith.localdoman> (raw)
In-Reply-To: <20230315110725.1215523-6-eric.auger@redhat.com>
Hi,
On Wed, Mar 15, 2023 at 12:07:24PM +0100, Eric Auger wrote:
> Add a new basic test that runs MEM_ACCESS loop over
> 100 iterations and make sure the number of measured
> MEM_ACCESS never overflows the margin. Some other
> pmu tests rely on this pattern and if the MEM_ACCESS
> measurement is not reliable, it is better to report
> it beforehand and not confuse the user any further.
>
> Without the subsequent patch, this typically fails on
> ThunderXv2 with the following logs:
>
> INFO: pmu: pmu-memaccess-reliability: 32-bit overflows:
> overflow=1 min=21 max=41 COUNT=20 MARGIN=15
> FAIL: pmu: pmu-memaccess-reliability: 32-bit overflows:
> memaccess is reliable
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> ---
> arm/pmu.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++
> arm/unittests.cfg | 6 ++++++
> 2 files changed, 58 insertions(+)
>
> diff --git a/arm/pmu.c b/arm/pmu.c
> index af679667..c3d2a428 100644
> --- a/arm/pmu.c
> +++ b/arm/pmu.c
> @@ -56,6 +56,7 @@
> #define EXT_COMMON_EVENTS_HIGH 0x403F
>
> #define ALL_SET_32 0x00000000FFFFFFFFULL
> +#define ALL_SET_64 0xFFFFFFFFFFFFFFFFULL
> #define ALL_CLEAR 0x0000000000000000ULL
> #define PRE_OVERFLOW_32 0x00000000FFFFFFF0ULL
> #define PRE_OVERFLOW_64 0xFFFFFFFFFFFFFFF0ULL
> @@ -67,6 +68,10 @@
> * for some observed variability we take into account a given @MARGIN
> */
> #define PRE_OVERFLOW2_32 (ALL_SET_32 - COUNT - MARGIN)
> +#define PRE_OVERFLOW2_64 (ALL_SET_64 - COUNT - MARGIN)
> +
> +#define PRE_OVERFLOW2(__overflow_at_64bits) \
> + (__overflow_at_64bits ? PRE_OVERFLOW2_64 : PRE_OVERFLOW2_32)
>
> #define PRE_OVERFLOW(__overflow_at_64bits) \
> (__overflow_at_64bits ? PRE_OVERFLOW_64 : PRE_OVERFLOW_32)
> @@ -746,6 +751,50 @@ static void disable_chain_counter(int even)
> isb();
> }
>
> +static void test_memaccess_reliability(bool overflow_at_64bits)
> +{
> + uint32_t events[] = {MEM_ACCESS};
> + void *addr = malloc(PAGE_SIZE);
> + uint64_t count, max = 0, min = pmevcntr_mask();
> + uint64_t pre_overflow2 = PRE_OVERFLOW2(overflow_at_64bits);
> + uint64_t pmcr_lp = overflow_at_64bits ? PMU_PMCR_LP : 0;
> + bool overflow = false;
> +
> + if (!satisfy_prerequisites(events, ARRAY_SIZE(events)) ||
> + !check_overflow_prerequisites(overflow_at_64bits))
> + return;
> +
> + pmu_reset();
> + write_regn_el0(pmevtyper, 0, MEM_ACCESS | PMEVTYPER_EXCLUDE_EL0);
> + for (int i = 0; i < 100; i++) {
> + pmu_reset();
> + write_regn_el0(pmevcntr, 0, pre_overflow2);
> + write_sysreg_s(0x1, PMCNTENSET_EL0);
> + isb();
> + mem_access_loop(addr, COUNT, pmu.pmcr_ro | PMU_PMCR_E | pmcr_lp);
> + count = read_regn_el0(pmevcntr, 0);
> + if (count < pre_overflow2) {
> + count += COUNT + MARGIN;
> + if (count > max)
> + max = count;
> + if (count < min)
> + min = count;
> + overflow = true;
> + report_info("iter=%d count=%ld min=%ld max=%ld overflow!!!",
> + i, count, min, max);
> + continue;
> + }
> + count -= pre_overflow2;
> + if (count > max)
> + max = count;
> + if (count < min)
> + min = count;
I'm having difficulties following the above maze of conditions. That's not going
to be easy to maintain.
If I understand the commit message correctly, the point of this test is to check
that PRE_OVERFLOW2 + COUNT doesn't overflow, but PRE_OVERFLOW2 + 2 * COUNT does.
How about this simpler approach instead:
for (int i = 0; i < 100; i++) {
pmu_reset();
write_regn_el0(pmevcntr, 0, pre_overflow2);
write_sysreg_s(0x1, PMCNTENSET_EL0);
isb();
mem_access_loop(addr, COUNT, pmu.pmcr_ro | PMU_PMCR_E | pmcr_lp);
count = read_regn_el0(pmevcntr, 0);
/* Counter overflowed when it shouldn't. */
if (count < pre_overflow2) {
report_fail("reliable memaccess loop");
return;
}
mem_access_loop(addr, COUNT, pmu.pmcr_ro | PMU_PMCR_E | pmcr_lp);
count = read_regn_el0(pmevcntr, 0);
/* Counter didn't overflow when it should. */
if (count >= pre_overflow2) {
report_fail("reliable memaccess loop");
return;
}
}
report_success("reliable memaccess loop");
Thanks,
Alex
> static void test_chain_promotion(bool unused)
> {
> uint32_t events[] = {MEM_ACCESS, CHAIN};
> @@ -1203,6 +1252,9 @@ int main(int argc, char *argv[])
> } else if (strcmp(argv[1], "pmu-basic-event-count") == 0) {
> run_event_test(argv[1], test_basic_event_count, false);
> run_event_test(argv[1], test_basic_event_count, true);
> + } else if (strcmp(argv[1], "pmu-memaccess-reliability") == 0) {
> + run_event_test(argv[1], test_memaccess_reliability, false);
> + run_event_test(argv[1], test_memaccess_reliability, true);
> } else if (strcmp(argv[1], "pmu-mem-access") == 0) {
> run_event_test(argv[1], test_mem_access, false);
> run_event_test(argv[1], test_mem_access, true);
> diff --git a/arm/unittests.cfg b/arm/unittests.cfg
> index 5e67b558..301261aa 100644
> --- a/arm/unittests.cfg
> +++ b/arm/unittests.cfg
> @@ -90,6 +90,12 @@ groups = pmu
> arch = arm64
> extra_params = -append 'pmu-mem-access'
>
> +[pmu-memaccess-reliability]
> +file = pmu.flat
> +groups = pmu
> +arch = arm64
> +extra_params = -append 'pmu-memaccess-reliability'
> +
> [pmu-sw-incr]
> file = pmu.flat
> groups = pmu
> --
> 2.38.1
>
next prev parent reply other threads:[~2023-04-21 11:13 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-15 11:07 [kvm-unit-tests PATCH 0/6] arm: pmu: Fix random failures of pmu-chain-promotion Eric Auger
2023-03-15 11:07 ` [kvm-unit-tests PATCH 1/6] arm: pmu: pmu-chain-promotion: Improve debug messages Eric Auger
2023-04-21 9:25 ` Alexandru Elisei
2023-04-24 20:09 ` Eric Auger
2023-03-15 11:07 ` [kvm-unit-tests PATCH 2/6] arm: pmu: pmu-chain-promotion: Introduce defines for count and margin values Eric Auger
2023-04-21 9:55 ` Alexandru Elisei
2023-04-24 20:09 ` Eric Auger
2023-03-15 11:07 ` [kvm-unit-tests PATCH 3/6] arm: pmu: Add extra DSB barriers in the mem_access loop Eric Auger
2023-04-21 10:25 ` Alexandru Elisei
2023-04-24 20:11 ` Eric Auger
2023-04-25 13:00 ` Alexandru Elisei
2023-03-15 11:07 ` [kvm-unit-tests PATCH 4/6] arm: pmu: Fix chain counter enable/disable sequences Eric Auger
2023-04-21 10:52 ` Alexandru Elisei
2023-04-21 11:24 ` Marc Zyngier
2023-03-15 11:07 ` [kvm-unit-tests PATCH 5/6] arm: pmu: Add pmu-memaccess-reliability test Eric Auger
2023-04-21 11:13 ` Alexandru Elisei [this message]
2023-03-15 11:07 ` [kvm-unit-tests PATCH 6/6] arm: pmu-chain-promotion: Increase the count and margin values Eric Auger
2023-04-04 6:23 ` [kvm-unit-tests PATCH 0/6] arm: pmu: Fix random failures of pmu-chain-promotion Eric Auger
2023-04-04 12:47 ` Andrew Jones
2023-04-12 7:34 ` Andrew Jones
2023-04-12 8:55 ` Alexandru Elisei
2023-04-12 8:47 ` Mark Rutland
2023-04-19 7:32 ` Eric Auger
2023-04-19 9:39 ` Alexandru Elisei
2023-04-21 8:11 ` Eric Auger
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=ZEJv2EINBwNRjBa6@monolith.localdoman \
--to=alexandru.elisei@arm.com \
--cc=andrew.jones@linux.dev \
--cc=eric.auger.pro@gmail.com \
--cc=eric.auger@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=reijiw@google.com \
--cc=ricarkol@google.com \
--cc=will@kernel.org \
/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