Function count_pmc() needs a memory barrier to ensure that PMC reads are fully consistent. The lack of it can occasionally fail pmc56_overflow test, since depending on the workload on the system, PMC5 & 6 can have past val- ues from the time the counters are frozen and turned back on. These past values will be accounted as overflows and make the test fail.
========= test: pmc56_overflow ... ebb_state: ... >>pmc[5] count = 0xfd4cbc8c >>pmc[6] count = 0xddd8b3b6 HW state: MMCR0 0x0000000084000000 FC PMAE MMCR2 0x0000000000000000 EBBHR 0x0000000010003f68 BESCR 0x8000000000000000 GE ... PMC5 0x0000000000000000 PMC6 0x0000000000000000 SIAR 0x0000000010003398 ... [3]: register SPRN_PMC2 = 0x0000000080000003 [4]: register SPRN_PMC5 = 0x0000000000000000 [5]: register SPRN_PMC6 = 0x0000000000000000 [6]: register SPRN_PMC2 = 0x0000000080000003 >>[7]: register SPRN_PMC5 = 0x000000008f21266d >>[8]: register SPRN_PMC6 = 0x000000000da80f8d [9]: register SPRN_PMC2 = 0x0000000080000003 >>[10]: register SPRN_PMC5 = 0x000000006e2b961f >>[11]: register SPRN_PMC6 = 0x00000000d030a429 [12]: register SPRN_PMC2 = 0x0000000080000003 [13]: register SPRN_PMC5 = 0x0000000000000000 [14]: register SPRN_PMC6 = 0x0000000000000000 ... PMC5/6 overflow 2 [FAIL] Test FAILED on line 87 failure: pmc56_overflow ========= Signed-off-by: Desnes A. Nunes do Rosario <desn...@linux.ibm.com> --- tools/testing/selftests/powerpc/pmu/ebb/ebb.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/testing/selftests/powerpc/pmu/ebb/ebb.c b/tools/testing/selftests/powerpc/pmu/ebb/ebb.c index bf6f25dfcf7b..6199f3cea0f9 100644 --- a/tools/testing/selftests/powerpc/pmu/ebb/ebb.c +++ b/tools/testing/selftests/powerpc/pmu/ebb/ebb.c @@ -258,6 +258,10 @@ int count_pmc(int pmc, uint32_t sample_period) start_value = pmc_sample_period(sample_period); val = read_pmc(pmc); + + /* Ensure pmc value is consistent between freezes */ + mb(); + if (val < start_value) ebb_state.stats.negative++; else -- 2.21.1