From: Thomas Huth <thuth@redhat.com>
To: kvm@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>
Cc: david@redhat.com, Janosch Frank <frankja@linux.ibm.com>
Subject: [kvm-unit-tests PULL 6/9] s390x: smp: Rework cpu start and active tracking
Date: Tue, 4 Feb 2020 08:13:32 +0100 [thread overview]
Message-ID: <20200204071335.18180-7-thuth@redhat.com> (raw)
In-Reply-To: <20200204071335.18180-1-thuth@redhat.com>
From: Janosch Frank <frankja@linux.ibm.com>
The architecture specifies that processing sigp orders may be
asynchronous, and this is indeed the case on some hypervisors, so we
need to wait until the cpu runs before we return from the setup/start
function.
As there was a lot of duplicate code, a common function for cpu
restarts has been introduced.
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20200201152851.82867-7-frankja@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
lib/s390x/smp.c | 56 ++++++++++++++++++++++++++++++-------------------
1 file changed, 35 insertions(+), 21 deletions(-)
diff --git a/lib/s390x/smp.c b/lib/s390x/smp.c
index f57f420..4578003 100644
--- a/lib/s390x/smp.c
+++ b/lib/s390x/smp.c
@@ -104,35 +104,52 @@ int smp_cpu_stop_store_status(uint16_t addr)
return rc;
}
+static int smp_cpu_restart_nolock(uint16_t addr, struct psw *psw)
+{
+ int rc;
+ struct cpu *cpu = smp_cpu_from_addr(addr);
+
+ if (!cpu)
+ return -1;
+ if (psw) {
+ cpu->lowcore->restart_new_psw.mask = psw->mask;
+ cpu->lowcore->restart_new_psw.addr = psw->addr;
+ }
+ /*
+ * Stop the cpu, so we don't have a race between a running cpu
+ * and the restart in the test that checks if the cpu is
+ * running after the restart.
+ */
+ smp_cpu_stop_nolock(addr, false);
+ rc = sigp(addr, SIGP_RESTART, 0, NULL);
+ if (rc)
+ return rc;
+ /*
+ * The order has been accepted, but the actual restart may not
+ * have been performed yet, so wait until the cpu is running.
+ */
+ while (!smp_cpu_running(addr))
+ mb();
+ cpu->active = true;
+ return 0;
+}
+
int smp_cpu_restart(uint16_t addr)
{
- int rc = -1;
- struct cpu *cpu;
+ int rc;
spin_lock(&lock);
- cpu = smp_cpu_from_addr(addr);
- if (cpu) {
- rc = sigp(addr, SIGP_RESTART, 0, NULL);
- cpu->active = true;
- }
+ rc = smp_cpu_restart_nolock(addr, NULL);
spin_unlock(&lock);
return rc;
}
int smp_cpu_start(uint16_t addr, struct psw psw)
{
- int rc = -1;
- struct cpu *cpu;
- struct lowcore *lc;
+ int rc;
spin_lock(&lock);
- cpu = smp_cpu_from_addr(addr);
- if (cpu) {
- lc = cpu->lowcore;
- lc->restart_new_psw.mask = psw.mask;
- lc->restart_new_psw.addr = psw.addr;
- rc = sigp(addr, SIGP_RESTART, 0, NULL);
- }
+ rc = smp_cpu_restart_nolock(addr, &psw);
spin_unlock(&lock);
return rc;
}
@@ -192,10 +209,7 @@ int smp_cpu_setup(uint16_t addr, struct psw psw)
lc->sw_int_crs[0] = 0x0000000000040000UL;
/* Start processing */
- rc = sigp_retry(cpu->addr, SIGP_RESTART, 0, NULL);
- if (!rc)
- cpu->active = true;
-
+ smp_cpu_restart_nolock(addr, NULL);
out:
spin_unlock(&lock);
return rc;
--
2.18.1
next prev parent reply other threads:[~2020-02-04 7:13 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-04 7:13 [kvm-unit-tests PULL 0/9] s390x and CI patches Thomas Huth
2020-02-04 7:13 ` [kvm-unit-tests PULL 1/9] s390x: smp: Cleanup smp.c Thomas Huth
2020-02-04 7:13 ` [kvm-unit-tests PULL 2/9] s390x: smp: Fix ecall and emcall report strings Thomas Huth
2020-02-04 7:13 ` [kvm-unit-tests PULL 3/9] s390x: Stop the cpu that is executing exit() Thomas Huth
2020-02-04 7:13 ` [kvm-unit-tests PULL 4/9] s390x: Add cpu id to interrupt error prints Thomas Huth
2020-02-04 7:13 ` [kvm-unit-tests PULL 5/9] s390x: smp: Only use smp_cpu_setup once Thomas Huth
2020-02-04 7:13 ` Thomas Huth [this message]
2020-02-04 7:13 ` [kvm-unit-tests PULL 7/9] s390x: smp: Wait for cpu setup to finish Thomas Huth
2020-02-04 7:13 ` [kvm-unit-tests PULL 8/9] gitlab-ci.yml: Remove ioapic from the x86 tests Thomas Huth
2020-02-04 7:13 ` [kvm-unit-tests PULL 9/9] travis.yml: Prevent 'script' from premature exit Thomas Huth
2020-02-05 14:58 ` [kvm-unit-tests PULL 0/9] s390x and CI patches Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200204071335.18180-7-thuth@redhat.com \
--to=thuth@redhat.com \
--cc=david@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox