Use the virtual instead of the physical timer for measuring the time taken to execute the microbenchmark. Internal testing discovered a performance regression on this test starting with Linux commit 680232a94c12 "KVM: arm64: timers: Allow save/restoring of the physical timer". Oliver Upton speculates QEMU is changing the guest physical counter to have a nonzero offset since it gained the ability as of that commit. As a consequence KVM is trap-and-emulating here on architectures without FEAT_ECV. While this isn't a correctness issue, the trap-and-emulate overhead of physical counter emulation on systems without ECV leads to surprising microbenchmark results. Signed-off-by: Colton Lewis <coltonlewis@xxxxxxxxxx> --- arm/micro-bench.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arm/micro-bench.c b/arm/micro-bench.c index bfd181dc..fbe59d03 100644 --- a/arm/micro-bench.c +++ b/arm/micro-bench.c @@ -348,10 +348,10 @@ static void loop_test(struct exit_test *test) while (ntimes < test->times && total_ns.ns < NS_5_SECONDS) { isb(); - start = read_sysreg(cntpct_el0); + start = read_sysreg(cntvct_el0); test->exec(); isb(); - end = read_sysreg(cntpct_el0); + end = read_sysreg(cntvct_el0); ntimes++; total_ticks += (end - start); -- 2.42.0.rc1.204.g551eb34607-goog