From: Eric Auger <eric.auger@redhat.com>
To: eric.auger.pro@gmail.com, eric.auger@redhat.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,
alexandru.elisei@arm.com
Subject: [kvm-unit-tests PATCH 5/6] arm: pmu: Add pmu-memaccess-reliability test
Date: Wed, 15 Mar 2023 12:07:24 +0100 [thread overview]
Message-ID: <20230315110725.1215523-6-eric.auger@redhat.com> (raw)
In-Reply-To: <20230315110725.1215523-1-eric.auger@redhat.com>
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;
+ }
+ report_info("overflow=%d min=%ld max=%ld COUNT=%d MARGIN=%d",
+ overflow, min, max, COUNT, MARGIN);
+ report(!overflow, "memaccess is reliable");
+}
+
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-03-15 11:18 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 ` Eric Auger [this message]
2023-04-21 11:13 ` [kvm-unit-tests PATCH 5/6] arm: pmu: Add pmu-memaccess-reliability test Alexandru Elisei
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=20230315110725.1215523-6-eric.auger@redhat.com \
--to=eric.auger@redhat.com \
--cc=alexandru.elisei@arm.com \
--cc=andrew.jones@linux.dev \
--cc=eric.auger.pro@gmail.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