On 09/02/2021 15.15, Janosch Frank 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.
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);
Thanks, this fixes the flaky test for me!
Tested-by: Thomas Huth <thuth@xxxxxxxxxx>
Reviewed-by: Thomas Huth <thuth@xxxxxxxxxx>