Hi, On 11/14/19 12:32 PM, Andrew Jones wrote: > 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 :-) Sorry, got confused, this patch changes it to return a value, and that value is ignored in the existing functions (the ones I listed above), which would make the usage of check_acked very inconsistent. >> 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? I think they should stay void, because they compute statistics, or print a warning if we got a spurious interrupt (check_spurious). I'm not really sure what to do about check_acked at the moment, I'll think about it some more. >> { >> 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? My suggestion was a quick hack to give an idea of how it might look, it can definitely be improved :) Thanks, Alex >> >> 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 > _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm