mbox series

[kvm-unit-tests,v4,0/6] arm: pmu: Add support for PMUv3p5

Message ID 20230126165351.2561582-1-ricarkol@google.com (mailing list archive)
Headers show
Series arm: pmu: Add support for PMUv3p5 | expand

Message

Ricardo Koller Jan. 26, 2023, 4:53 p.m. UTC
The first commit fixes the tests when running on PMUv3p5. The issue is that
PMUv3p5 uses 64-bit counters irrespective of whether the PMU is configured
for overflowing at 32 or 64-bits. Tests are currently failing [0] on
PMUv3p5 because of this. They wrongly assume that values will be wrapped
around 32-bits, but they overflow into the other half of the 64-bit
counters.

The second and third commits add new tests for 64-bit overflows, a feature
added with PMUv3p5 (PMCR_EL0.LP == 1). This is done by running all
overflow-related tests in two modes: with 32-bit and 64-bit overflows.
The fourt commit changes the value reporting to use %lx instead of %ld.

This series was tested on PMUv3p5 and PMUv3p4 using the ARM Fast Model and
kvmtool.  All tests pass on both PMUv3p5 and PMUv3p4 when using Marc's
PMUv3p5 series [0], plus the suggestion made at [1]. Didn't test AArch32.

Changes from v3:
- Added commit to fix test_overflow_interrupt(). (Reiji and Eric)
- Separated s/ALL_SET/ALL_SET_32/ and s/PRE_OVERFLOW/PRE_OVERFLOW_32
  into its own commit. (Reiji and Eric)
- Fix s/200/20. (Eric)

Changes from v2:
- used Oliver's suggestion of using pmevcntr_mask() for masking counters to
  32 or 64 bits, instead of casting to uint32_t or uint64_t.
- removed ALL_SET_AT() in favor of pmevcntr_mask(). (Oliver)
- moved the change to have odd counter overflows at 64-bits from first to
  third commit.
- renamed PRE_OVERFLOW macro to PRE_OVERFLOW_32, and PRE_OVERFLOW_AT() to
  PRE_OVERFLOW().

Changes from v1 (all suggested by Alexandru):
- report counter values in hexadecimal
- s/overflow_at_64bits/unused for all chained tests
- check that odd counters do not increment when using overflow_at_64bits
  (pmcr.LP=1)
- test 64-bit odd counters overflows
- switch confusing var names in test_chained_sw_incr(): cntr0 <-> cntr1

[0] https://lore.kernel.org/kvmarm/20221113163832.3154370-1-maz@kernel.org/
[1] https://lore.kernel.org/kvmarm/Y4jasyxvFRNvvmox@google.com/

Ricardo Koller (6):
  arm: pmu: Fix overflow checks for PMUv3p5 long counters
  arm: pmu: Prepare for testing 64-bit overflows
  arm: pmu: Rename ALL_SET and PRE_OVERFLOW
  arm: pmu: Add tests for 64-bit overflows
  arm: pmu: Print counter values as hexadecimals
  arm: pmu: Fix test_overflow_interrupt()

 arm/pmu.c | 298 ++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 188 insertions(+), 110 deletions(-)

Comments

Andrew Jones Feb. 14, 2023, 8:18 p.m. UTC | #1
On Thu, Jan 26, 2023 at 04:53:45PM +0000, Ricardo Koller wrote:
> The first commit fixes the tests when running on PMUv3p5. The issue is that
> PMUv3p5 uses 64-bit counters irrespective of whether the PMU is configured
> for overflowing at 32 or 64-bits. Tests are currently failing [0] on
> PMUv3p5 because of this. They wrongly assume that values will be wrapped
> around 32-bits, but they overflow into the other half of the 64-bit
> counters.
> 
> The second and third commits add new tests for 64-bit overflows, a feature
> added with PMUv3p5 (PMCR_EL0.LP == 1). This is done by running all
> overflow-related tests in two modes: with 32-bit and 64-bit overflows.
> The fourt commit changes the value reporting to use %lx instead of %ld.
> 
> This series was tested on PMUv3p5 and PMUv3p4 using the ARM Fast Model and
> kvmtool.  All tests pass on both PMUv3p5 and PMUv3p4 when using Marc's
> PMUv3p5 series [0], plus the suggestion made at [1]. Didn't test AArch32.
> 
> Changes from v3:
> - Added commit to fix test_overflow_interrupt(). (Reiji and Eric)
> - Separated s/ALL_SET/ALL_SET_32/ and s/PRE_OVERFLOW/PRE_OVERFLOW_32
>   into its own commit. (Reiji and Eric)
> - Fix s/200/20. (Eric)
> 
> Changes from v2:
> - used Oliver's suggestion of using pmevcntr_mask() for masking counters to
>   32 or 64 bits, instead of casting to uint32_t or uint64_t.
> - removed ALL_SET_AT() in favor of pmevcntr_mask(). (Oliver)
> - moved the change to have odd counter overflows at 64-bits from first to
>   third commit.
> - renamed PRE_OVERFLOW macro to PRE_OVERFLOW_32, and PRE_OVERFLOW_AT() to
>   PRE_OVERFLOW().
> 
> Changes from v1 (all suggested by Alexandru):
> - report counter values in hexadecimal
> - s/overflow_at_64bits/unused for all chained tests
> - check that odd counters do not increment when using overflow_at_64bits
>   (pmcr.LP=1)
> - test 64-bit odd counters overflows
> - switch confusing var names in test_chained_sw_incr(): cntr0 <-> cntr1
> 
> [0] https://lore.kernel.org/kvmarm/20221113163832.3154370-1-maz@kernel.org/
> [1] https://lore.kernel.org/kvmarm/Y4jasyxvFRNvvmox@google.com/
> 
> Ricardo Koller (6):
>   arm: pmu: Fix overflow checks for PMUv3p5 long counters
>   arm: pmu: Prepare for testing 64-bit overflows
>   arm: pmu: Rename ALL_SET and PRE_OVERFLOW
>   arm: pmu: Add tests for 64-bit overflows
>   arm: pmu: Print counter values as hexadecimals
>   arm: pmu: Fix test_overflow_interrupt()
> 
>  arm/pmu.c | 298 ++++++++++++++++++++++++++++++++++--------------------
>  1 file changed, 188 insertions(+), 110 deletions(-)
> 
> -- 
> 2.39.1.456.gfc5497dd1b-goog
>

Applied, thanks