beffde47a8
- kvm-spec-Update-seavgabios-dependency.patch [bz#1725664] - kvm-pc-Don-t-make-die-id-mandatory-unless-necessary.patch [bz#1741451] - kvm-display-bochs-fix-pcie-support.patch [bz#1733977 bz#1740692] - kvm-spapr-Reset-CAS-IRQ-subsystem-after-devices.patch [bz#1733977] - kvm-spapr-xive-Fix-migration-of-hot-plugged-CPUs.patch [bz#1733977] - kvm-riscv-roms-Fix-make-rules-for-building-sifive_u-bios.patch [bz#1733977 bz#1740692] - kvm-Update-version-for-v4.1.0-release.patch [bz#1733977 bz#1740692] - Resolves: bz#1725664 (Update seabios dependency) - Resolves: bz#1733977 (Qemu core dumped: /home/ngu/qemu/hw/intc/xics_kvm.c:321: ics_kvm_set_irq: Assertion `kernel_xics_fd != -1' failed) - Resolves: bz#1740692 (Backport QEMU 4.1.0 rc5 & ga patches) - Resolves: bz#1741451 (Failed to hot-plug vcpus)
136 lines
4.8 KiB
Diff
136 lines
4.8 KiB
Diff
From 1a1ee2ef4c4c1dc310929e5d752a64eeb3f5245b Mon Sep 17 00:00:00 2001
|
|
From: Miroslav Rezanina <mrezanin@redhat.com>
|
|
Date: Mon, 19 Aug 2019 08:54:17 +0100
|
|
Subject: [PATCH 5/7] spapr/xive: Fix migration of hot-plugged CPUs
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
|
|
Message-id: <7cdadb2fe39b9edfc4c281f4efb6f5afa0b1503f.1566204425.git.mrezanin@redhat.com>
|
|
Patchwork-id: 90058
|
|
O-Subject: [RHEL-AV-8.1 qemu-kvm PATCH 3/5] spapr/xive: Fix migration of hot-plugged CPUs
|
|
Bugzilla: 1733977
|
|
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
|
RH-Acked-by: Yash Mankad <ymankad@redhat.com>
|
|
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
|
|
|
From: Cédric Le Goater <clg@kaod.org>
|
|
|
|
Bugzilla: 1733977
|
|
|
|
The migration sequence of a guest using the XIVE exploitation mode
|
|
relies on the fact that the states of all devices are restored before
|
|
the machine is. This is not true for hot-plug devices such as CPUs
|
|
which state come after the machine. This breaks migration because the
|
|
thread interrupt context registers are not correctly set.
|
|
|
|
Fix migration of hotplugged CPUs by restoring their context in the
|
|
'post_load' handler of the XiveTCTX model.
|
|
|
|
Fixes: 277dd3d7712a ("spapr/xive: add migration support for KVM")
|
|
Signed-off-by: Cédric Le Goater <clg@kaod.org>
|
|
Message-Id: <20190813064853.29310-1-clg@kaod.org>
|
|
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
(cherry picked from commit 310cda5b5e9df642b19a0e9c504368ffba3b3ab9)
|
|
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
hw/intc/spapr_xive_kvm.c | 19 +++++++++++++++++--
|
|
hw/intc/xive.c | 21 ++++++++++++++++++++-
|
|
include/hw/ppc/xive.h | 1 +
|
|
3 files changed, 38 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/hw/intc/spapr_xive_kvm.c b/hw/intc/spapr_xive_kvm.c
|
|
index 3bf8e7a..8898615 100644
|
|
--- a/hw/intc/spapr_xive_kvm.c
|
|
+++ b/hw/intc/spapr_xive_kvm.c
|
|
@@ -72,11 +72,17 @@ static void kvm_cpu_disable_all(void)
|
|
* XIVE Thread Interrupt Management context (KVM)
|
|
*/
|
|
|
|
-static void kvmppc_xive_cpu_set_state(XiveTCTX *tctx, Error **errp)
|
|
+void kvmppc_xive_cpu_set_state(XiveTCTX *tctx, Error **errp)
|
|
{
|
|
+ SpaprXive *xive = SPAPR_MACHINE(qdev_get_machine())->xive;
|
|
uint64_t state[2];
|
|
int ret;
|
|
|
|
+ /* The KVM XIVE device is not in use yet */
|
|
+ if (xive->fd == -1) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
/* word0 and word1 of the OS ring. */
|
|
state[0] = *((uint64_t *) &tctx->regs[TM_QW1_OS]);
|
|
|
|
@@ -655,7 +661,16 @@ int kvmppc_xive_post_load(SpaprXive *xive, int version_id)
|
|
}
|
|
}
|
|
|
|
- /* Restore the thread interrupt contexts */
|
|
+ /*
|
|
+ * Restore the thread interrupt contexts of initial CPUs.
|
|
+ *
|
|
+ * The context of hotplugged CPUs is restored later, by the
|
|
+ * 'post_load' handler of the XiveTCTX model because they are not
|
|
+ * available at the time the SpaprXive 'post_load' method is
|
|
+ * called. We can not restore the context of all CPUs in the
|
|
+ * 'post_load' handler of XiveTCTX because the machine is not
|
|
+ * necessarily connected to the KVM device at that time.
|
|
+ */
|
|
CPU_FOREACH(cs) {
|
|
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
|
|
|
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
|
|
index cf77bdb..da148e9 100644
|
|
--- a/hw/intc/xive.c
|
|
+++ b/hw/intc/xive.c
|
|
@@ -615,12 +615,31 @@ static int vmstate_xive_tctx_pre_save(void *opaque)
|
|
return 0;
|
|
}
|
|
|
|
+static int vmstate_xive_tctx_post_load(void *opaque, int version_id)
|
|
+{
|
|
+ Error *local_err = NULL;
|
|
+
|
|
+ if (kvm_irqchip_in_kernel()) {
|
|
+ /*
|
|
+ * Required for hotplugged CPU, for which the state comes
|
|
+ * after all states of the machine.
|
|
+ */
|
|
+ kvmppc_xive_cpu_set_state(XIVE_TCTX(opaque), &local_err);
|
|
+ if (local_err) {
|
|
+ error_report_err(local_err);
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static const VMStateDescription vmstate_xive_tctx = {
|
|
.name = TYPE_XIVE_TCTX,
|
|
.version_id = 1,
|
|
.minimum_version_id = 1,
|
|
.pre_save = vmstate_xive_tctx_pre_save,
|
|
- .post_load = NULL, /* handled by the sPAPRxive model */
|
|
+ .post_load = vmstate_xive_tctx_post_load,
|
|
.fields = (VMStateField[]) {
|
|
VMSTATE_BUFFER(regs, XiveTCTX),
|
|
VMSTATE_END_OF_LIST()
|
|
diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
|
|
index 55c53c7..7363351 100644
|
|
--- a/include/hw/ppc/xive.h
|
|
+++ b/include/hw/ppc/xive.h
|
|
@@ -438,5 +438,6 @@ void kvmppc_xive_source_set_irq(void *opaque, int srcno, int val);
|
|
void kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp);
|
|
void kvmppc_xive_cpu_synchronize_state(XiveTCTX *tctx, Error **errp);
|
|
void kvmppc_xive_cpu_get_state(XiveTCTX *tctx, Error **errp);
|
|
+void kvmppc_xive_cpu_set_state(XiveTCTX *tctx, Error **errp);
|
|
|
|
#endif /* PPC_XIVE_H */
|
|
--
|
|
1.8.3.1
|
|
|