All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: peter.maydell@linaro.org
Cc: agraf@suse.de, aik@ozlabs.ru, groug@kaod.org, clg@kaod.org,
	lvivier@redhat.com, qemu-devel@nongnu.org, qemu-ppc@nongnu.org,
	David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH 04/23] spapr_cpu_core: migrate VPA related state
Date: Fri, 22 Jun 2018 14:24:18 +1000	[thread overview]
Message-ID: <20180622042437.14259-4-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20180622042437.14259-1-david@gibson.dropbear.id.au>

From: Greg Kurz <groug@kaod.org>

QEMU implements the "Shared Processor LPAR" (SPLPAR) option, which allows
the hypervisor to time-slice a physical processor into multiple virtual
processor. The intent is to allow more guests to run, and to optimize
processor utilization.

The guest OS can cede idle VCPUs, so that their processing capacity may
be used by other VCPUs, with the H_CEDE hcall. The guest OS can also
optimize spinlocks, by confering the time-slice of a spinning VCPU to the
spinlock holder if it's currently notrunning, with the H_CONFER hcall.

Both hcalls depend on a "Virtual Processor Area" (VPA) to be registered
by the guest OS, generally during early boot. Other per-VCPU areas can
be registered: the "SLB Shadow Buffer" which allows a more efficient
dispatching of VCPUs, and the "Dispatch Trace Log Buffer" (DTL) which
is used to compute time stolen by the hypervisor. Both DTL and SLB Shadow
areas depend on the VPA to be registered.

The VPA/SLB Shadow/DTL are state that QEMU should migrate, but this doesn't
happen, for no apparent reason other than it was just never coded. This
causes the features listed above to stop working after migration, and it
breaks the logic of the H_REGISTER_VPA hcall in the destination.

The VPA is set at the guest request, ie, we don't have to migrate
it before the guest has actually set it. This patch hence adds an
"spapr_cpu/vpa" subsection to the recently introduced per-CPU machine
data migration stream.

Since DTL and SLB Shadow are optional and both depend on VPA, they get
their own subsections "spapr_cpu/vpa/slb_shadow" and "spapr_cpu/vpa/dtl"
hanging from the "spapr_cpu/vpa" subsection.

Note that this won't break migration to older QEMUs. Is is already handled
by only registering the vmstate handler for per-CPU data with newer machine
types.

Signed-off-by: Greg Kurz <groug@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_cpu_core.c | 65 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index f129ac884e..67f1596c57 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -129,6 +129,67 @@ static void spapr_cpu_core_unrealize(DeviceState *dev, Error **errp)
     g_free(sc->threads);
 }
 
+static bool slb_shadow_needed(void *opaque)
+{
+    sPAPRCPUState *spapr_cpu = opaque;
+
+    return spapr_cpu->slb_shadow_addr != 0;
+}
+
+static const VMStateDescription vmstate_spapr_cpu_slb_shadow = {
+    .name = "spapr_cpu/vpa/slb_shadow",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .needed = slb_shadow_needed,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT64(slb_shadow_addr, sPAPRCPUState),
+        VMSTATE_UINT64(slb_shadow_size, sPAPRCPUState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static bool dtl_needed(void *opaque)
+{
+    sPAPRCPUState *spapr_cpu = opaque;
+
+    return spapr_cpu->dtl_addr != 0;
+}
+
+static const VMStateDescription vmstate_spapr_cpu_dtl = {
+    .name = "spapr_cpu/vpa/dtl",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .needed = dtl_needed,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT64(dtl_addr, sPAPRCPUState),
+        VMSTATE_UINT64(dtl_size, sPAPRCPUState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static bool vpa_needed(void *opaque)
+{
+    sPAPRCPUState *spapr_cpu = opaque;
+
+    return spapr_cpu->vpa_addr != 0;
+}
+
+static const VMStateDescription vmstate_spapr_cpu_vpa = {
+    .name = "spapr_cpu/vpa",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .needed = vpa_needed,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT64(vpa_addr, sPAPRCPUState),
+        VMSTATE_END_OF_LIST()
+    },
+    .subsections = (const VMStateDescription * []) {
+        &vmstate_spapr_cpu_slb_shadow,
+        &vmstate_spapr_cpu_dtl,
+        NULL
+    }
+};
+
 static const VMStateDescription vmstate_spapr_cpu_state = {
     .name = "spapr_cpu",
     .version_id = 1,
@@ -136,6 +197,10 @@ static const VMStateDescription vmstate_spapr_cpu_state = {
     .fields = (VMStateField[]) {
         VMSTATE_END_OF_LIST()
     },
+    .subsections = (const VMStateDescription * []) {
+        &vmstate_spapr_cpu_vpa,
+        NULL
+    }
 };
 
 static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr,
-- 
2.17.1

  parent reply	other threads:[~2018-06-22  4:24 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-22  4:24 [Qemu-devel] [PATCH 01/23] ppc/pnv: introduce a new intc_create() operation to the chip model David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 02/23] ppc/pnv: introduce a new isa_create() " David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 03/23] spapr_cpu_core: migrate per-CPU data David Gibson
2018-06-22  4:24 ` David Gibson [this message]
2018-06-22  4:24 ` [Qemu-devel] [PATCH 05/23] ppc/pnv: introduce Pnv8Chip and Pnv9Chip models David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 06/23] ppc/pnv: consolidate the creation of the ISA bus device tree David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 07/23] target/ppc: Allow cpu compatiblity checks based on type, not instance David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 08/23] spapr: Compute effective capability values earlier David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 09/23] spapr: Add cpu_apply hook to capabilities David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 10/23] target/ppc: Add kvmppc_hpt_needs_host_contiguous_pages() helper David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 11/23] spapr: split the IRQ allocation sequence David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 12/23] spapr: remove unused spapr_irq routines David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 13/23] fpu_helper.c: fix helper_fpscr_clrbit() function David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 14/23] sm501: Fix hardware cursor color conversion David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 15/23] ppc4xx_i2c: Remove unimplemented sdata and intr registers David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 16/23] ppc4xx_i2c: Implement directcntl register David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 17/23] target/ppc: Add missing opcode for icbt on PPC440 David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 18/23] pseries: Update SLOF firmware image to qemu-slof-20180621 David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 19/23] spapr: Maximum (HPT) pagesize property David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 20/23] spapr: Use maximum page size capability to simplify memory backend checking David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 21/23] target/ppc: Add ppc_hash64_filter_pagesizes() David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 22/23] spapr: Limit available pagesizes to provide a consistent guest environment David Gibson
2018-06-22  4:24 ` [Qemu-devel] [PATCH 23/23] spapr: Don't rewrite mmu capabilities in KVM mode David Gibson
2018-06-22  9:44 ` [Qemu-devel] [PATCH 01/23] ppc/pnv: introduce a new intc_create() operation to the chip model Greg Kurz
2018-06-22 10:32   ` David Gibson
2018-06-26  9:07 ` Peter Maydell
2018-06-26  9:31   ` Cédric Le Goater

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=20180622042437.14259-4-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=agraf@suse.de \
    --cc=aik@ozlabs.ru \
    --cc=clg@kaod.org \
    --cc=groug@kaod.org \
    --cc=lvivier@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.