On 2/9/21 5:08 PM, Claudio Imbrenda wrote: > On Tue, 9 Feb 2021 09:15:54 -0500 > Janosch Frank <frankja@xxxxxxxxxxxxx> wrote: > >> KVM and QEMU handle a SIGP stop and store status in two steps: >> 1) Stop the CPU by injecting a stop request >> 2) Store when the CPU has left SIE because of the stop request >> >> The problem is that the SIGP order is already considered completed by >> KVM/QEMU when step 1 has been performed and not once both have >> completed. In addition we currently don't implement the busy CC so a >> kernel has no way of knowing that the store has finished other than >> checking the location for the store. >> >> This workaround is based on the fact that for a new SIE entry (via the >> added smp restart) a stop with the store status has to be finished >> first. >> >> Correct handling of this in KVM/QEMU will need some thought and time. > > do I understand correctly that you are here "fixing" the test by not > triggering the KVM bug? Shouldn't we try to trigger as many bugs as > possible instead? This is not a bug, it's missing code :-) We trigger a higher number of bugs by running tests and this workaround does exactly that by letting Thomas use the smp test in the CI again. > >> Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> >> --- >> s390x/smp.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/s390x/smp.c b/s390x/smp.c >> index b0ece491..32f284a2 100644 >> --- a/s390x/smp.c >> +++ b/s390x/smp.c >> @@ -102,12 +102,15 @@ static void test_stop_store_status(void) >> lc->grs_sa[15] = 0; >> smp_cpu_stop_store_status(1); >> mb(); >> + report(smp_cpu_stopped(1), "cpu stopped"); >> + /* For the cpu to be started it should have finished storing >> */ >> + smp_cpu_restart(1); >> report(lc->prefix_sa == (uint32_t)(uintptr_t)cpu->lowcore, >> "prefix"); report(lc->grs_sa[15], "stack"); >> - report(smp_cpu_stopped(1), "cpu stopped"); >> report_prefix_pop(); >> >> report_prefix_push("stopped"); >> + smp_cpu_stop(1); >> lc->prefix_sa = 0; >> lc->grs_sa[15] = 0; >> smp_cpu_stop_store_status(1); >