arm64: microbench: Add time limit for each individual test
Besides using separate running times parameter, we add time limit
for loop_test to make sure each test should be done in a certain
time(5 sec here).
Signed-off-by: Jingyi Wang <wangjingyi11@huawei.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
[ Initialize total_ns to zero. ]
Signed-off-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/arm/micro-bench.c b/arm/micro-bench.c
index 93bd855..74bd60a 100644
--- a/arm/micro-bench.c
+++ b/arm/micro-bench.c
@@ -22,6 +22,7 @@
#include <asm/gic.h>
#include <asm/gic-v3-its.h>
+#define NS_5_SECONDS (5 * 1000 * 1000 * 1000UL)
static u32 cntfrq;
static volatile bool irq_ready, irq_received;
@@ -265,25 +266,28 @@
static void loop_test(struct exit_test *test)
{
uint64_t start, end, total_ticks, ntimes = 0;
- struct ns_time total_ns, avg_ns;
+ struct ns_time avg_ns, total_ns = {};
+ total_ticks = 0;
if (test->prep) {
if(!test->prep()) {
printf("%s test skipped\n", test->name);
return;
}
}
- isb();
- start = read_sysreg(cntpct_el0);
- while (ntimes < test->times) {
- test->exec();
- ntimes++;
- }
- isb();
- end = read_sysreg(cntpct_el0);
- total_ticks = end - start;
- ticks_to_ns_time(total_ticks, &total_ns);
+ while (ntimes < test->times && total_ns.ns < NS_5_SECONDS) {
+ isb();
+ start = read_sysreg(cntpct_el0);
+ test->exec();
+ isb();
+ end = read_sysreg(cntpct_el0);
+
+ ntimes++;
+ total_ticks += (end - start);
+ ticks_to_ns_time(total_ticks, &total_ns);
+ }
+
avg_ns.ns = total_ns.ns / ntimes;
avg_ns.ns_frac = total_ns.ns_frac / ntimes;