On Fri, Jul 31, 2020 at 03:42:41PM +0800, Jingyi Wang wrote: > 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@xxxxxxxxxx> > Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> > --- > arm/micro-bench.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) > > diff --git a/arm/micro-bench.c b/arm/micro-bench.c > index 93bd855..09d9d53 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; > @@ -267,23 +268,26 @@ static void loop_test(struct exit_test *test) > uint64_t start, end, total_ticks, ntimes = 0; > struct ns_time total_ns, avg_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) { > + > + while (ntimes < test->times && total_ns.ns < NS_5_SECONDS) { total_ns.ns is now being used uninitialized here. It needs to be initialized to zero above with total_ns = {}. I'll do this fixup myself. Thanks, drew > + 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); > } > - isb(); > - end = read_sysreg(cntpct_el0); > > - 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; > > -- > 2.19.1 > >