On Tue, Nov 12, 2019 at 03:23:04PM +0000, Alexandru Elisei wrote: > check_acked is starting to become hard to read. Agreed. check_acked() could probably have some of its subtests factored out to improve its readability. > The function itself is rather inconsistent, as it mixes regular > printf's with report_info's. Sounds good > The return value is also never used: > > $ awk '/check_acked\(/ && !/const/' arm/gic.c > check_acked("IPI: self", &mask); > check_acked("IPI: directed", &mask); > check_acked("IPI: broadcast", &mask); That's good, since it's a void function :-) > > What I'm thinking is that we can rewrite check_acked to return true/false (or > 0/1), meaning success or failure, remove the testname parameter, replace the > printfs to report_info, and have the caller do a report based on the value > returned by check_acked. > > Rough version, compile tested only, I'm sure it can be improved: > > diff --git a/arm/gic.c b/arm/gic.c > index adb6aa464513..5453f2fd3d5f 100644 > --- a/arm/gic.c > +++ b/arm/gic.c > @@ -60,11 +60,11 @@ static void stats_reset(void) > smp_wmb(); > } > > -static void check_acked(const char *testname, cpumask_t *mask) > +static bool check_acked(cpumask_t *mask) We have several check_* functions in arm/gic.c, and they're all void functions. Changing this one to a bool would be inconsistent, but maybe that consistency isn't that important, or maybe they should all be bool? > { > int missing = 0, extra = 0, unexpected = 0; > int nr_pass, cpu, i; > - bool bad = false; > + bool success = true; > > /* Wait up to 5s for all interrupts to be delivered */ > for (i = 0; i < 50; ++i) { > @@ -76,22 +76,21 @@ static void check_acked(const char *testname, cpumask_t *mask) > acked[cpu] == 1 : acked[cpu] == 0; > > if (bad_sender[cpu] != -1) { > - printf("cpu%d received IPI from wrong sender %d\n", > + report_info("cpu%d received IPI from wrong sender > %d\n", > cpu, bad_sender[cpu]); > - bad = true; > + success = false; > } > > if (bad_irq[cpu] != -1) { > - printf("cpu%d received wrong irq %d\n", > + report_info("cpu%d received wrong irq %d\n", > cpu, bad_irq[cpu]); > - bad = true; > + success = false; > } > } > if (nr_pass == nr_cpus) { > - report("%s", !bad, testname); > if (i) > report_info("took more than %d ms", i * 100); > - return; > + return success; > } > } > > @@ -107,9 +106,9 @@ static void check_acked(const char *testname, cpumask_t *mask) > } > } > > - report("%s", false, testname); > report_info("Timed-out (5s). ACKS: missing=%d extra=%d unexpected=%d", > missing, extra, unexpected); > + return false; > } > > static void check_spurious(void) > @@ -183,13 +182,11 @@ static void ipi_test_self(void) > { > cpumask_t mask; > > - report_prefix_push("self"); > stats_reset(); > cpumask_clear(&mask); > cpumask_set_cpu(smp_processor_id(), &mask); > gic->ipi.send_self(); > - check_acked("IPI: self", &mask); > - report_prefix_pop(); > + report("self", check_acked(&mask)); > } > > static void ipi_test_smp(void) > @@ -203,7 +200,7 @@ static void ipi_test_smp(void) > for (i = smp_processor_id() & 1; i < nr_cpus; i += 2) > cpumask_clear_cpu(i, &mask); > gic_ipi_send_mask(IPI_IRQ, &mask); > - check_acked("IPI: directed", &mask); > + report("directed", check_acked(&mask)); > report_prefix_pop(); Shouldn't we also drop the "target-list" prefix push/pop? > > report_prefix_push("broadcast"); > @@ -211,7 +208,7 @@ static void ipi_test_smp(void) > cpumask_copy(&mask, &cpu_present_mask); > cpumask_clear_cpu(smp_processor_id(), &mask); > gic->ipi.send_broadcast(); > - check_acked("IPI: broadcast", &mask); > + report("broadcast", check_acked(&mask)); > report_prefix_pop(); > } Shouldn't we also drop the "broadcast" prefix push/pop? > > I've removed "IPI" from the report string because the prefixed was already pushed > in main. > > Andrew, what do you think? Are we missing something obvious? Do you have a better > idea? I'm happy to see cleanups and haven't had a chance to look too closely at the gic tests in a while so I have no better ideas :-) Thanks, drew