qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH 2/2] spapr_cpu_core: migrate VPA related state


From: David Gibson
Subject: Re: [Qemu-ppc] [PATCH 2/2] spapr_cpu_core: migrate VPA related state
Date: Tue, 19 Jun 2018 10:30:02 +1000
User-agent: Mutt/1.10.0 (2018-05-17)

On Mon, Jun 18, 2018 at 02:26:49PM +0200, Greg Kurz wrote:
> 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 <address@hidden>

Applied to ppc-for-3.0, thanks.

> ---
>  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 96d1dfad00e1..f7e7b739ae49 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,
> 

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]