qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] spapr: Don't migrate the hpt_maxpagesize cap to


From: David Gibson
Subject: Re: [Qemu-devel] [PATCH] spapr: Don't migrate the hpt_maxpagesize cap to older machine types
Date: Thu, 23 May 2019 09:22:46 +1000
User-agent: Mutt/1.11.4 (2019-03-13)

On Wed, May 22, 2019 at 03:43:46PM +0200, Greg Kurz wrote:
> Commit 0b8c89be7f7b added the hpt_maxpagesize capability to the migration
> stream. This is okay for new machine types but it breaks backward migration
> to older QEMUs, which don't expect the extra subsection.
> 
> Add a compatibility boolean flag to the sPAPR machine class and use it to
> skip migration of the capability for machine types 4.0 and older. This
> fixes migration to an older QEMU. Note that the destination will emit a
> warning:
> 
> qemu-system-ppc64: warning: cap-hpt-max-page-size lower level (16) in 
> incoming stream than on destination (24)
> 
> This is expected and harmless though. It is okay to migrate from a lower
> HPT maximum page size (64k) to a greater one (16M).
> 
> Fixes: 0b8c89be7f7b "spapr: Add forgotten capability to migration stream"
> Based-on: <address@hidden>
> Signed-off-by: Greg Kurz <address@hidden>

Applied, thanks.

> ---
> 
> Please notice that this is based on Cedric's patch that make "dual" the
> default for the ic-mode property.
> ---
>  hw/ppc/spapr.c         |    1 +
>  hw/ppc/spapr_caps.c    |   12 +++++++++++-
>  include/hw/ppc/spapr.h |    1 +
>  3 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 4fd16b43f014..e2b33e5890ae 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -4431,6 +4431,7 @@ static void 
> spapr_machine_4_0_class_options(MachineClass *mc)
>      compat_props_add(mc->compat_props, hw_compat_4_0, hw_compat_4_0_len);
>      smc->phb_placement = phb_placement_4_0;
>      smc->irq = &spapr_irq_xics;
> +    smc->pre_4_1_migration = true;
>  }
>  
>  DEFINE_SPAPR_MACHINE(4_0, "4.0", false);
> diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
> index 658eb15a147b..31b466139975 100644
> --- a/hw/ppc/spapr_caps.c
> +++ b/hw/ppc/spapr_caps.c
> @@ -64,6 +64,7 @@ typedef struct SpaprCapabilityInfo {
>      void (*apply)(SpaprMachineState *spapr, uint8_t val, Error **errp);
>      void (*cpu_apply)(SpaprMachineState *spapr, PowerPCCPU *cpu,
>                        uint8_t val, Error **errp);
> +    bool (*migrate_needed)(void *opaque);
>  } SpaprCapabilityInfo;
>  
>  static void spapr_cap_get_bool(Object *obj, Visitor *v, const char *name,
> @@ -350,6 +351,11 @@ static void cap_hpt_maxpagesize_apply(SpaprMachineState 
> *spapr,
>      spapr_check_pagesize(spapr, qemu_minrampagesize(), errp);
>  }
>  
> +static bool cap_hpt_maxpagesize_migrate_needed(void *opaque)
> +{
> +    return !SPAPR_MACHINE_GET_CLASS(opaque)->pre_4_1_migration;
> +}
> +
>  static bool spapr_pagesize_cb(void *opaque, uint32_t seg_pshift,
>                                uint32_t pshift)
>  {
> @@ -542,6 +548,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
>          .type = "int",
>          .apply = cap_hpt_maxpagesize_apply,
>          .cpu_apply = cap_hpt_maxpagesize_cpu_apply,
> +        .migrate_needed = cap_hpt_maxpagesize_migrate_needed,
>      },
>      [SPAPR_CAP_NESTED_KVM_HV] = {
>          .name = "nested-hv",
> @@ -679,8 +686,11 @@ int spapr_caps_post_migration(SpaprMachineState *spapr)
>  static bool spapr_cap_##sname##_needed(void *opaque)    \
>  {                                                       \
>      SpaprMachineState *spapr = opaque;                  \
> +    bool (*needed)(void *opaque) =                      \
> +        capability_table[cap].migrate_needed;           \
>                                                          \
> -    return spapr->cmd_line_caps[cap] &&                 \
> +    return needed ? needed(opaque) : true &&            \
> +           spapr->cmd_line_caps[cap] &&                 \
>             (spapr->eff.caps[cap] !=                     \
>              spapr->def.caps[cap]);                      \
>  }                                                       \
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index 9fc91c8f5eac..4f5becf1f3cc 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -119,6 +119,7 @@ struct SpaprMachineClass {
>      bool pre_2_10_has_unused_icps;
>      bool legacy_irq_allocation;
>      bool broken_host_serial_model; /* present real host info to the guest */
> +    bool pre_4_1_migration; /* don't migrate hpt-max-page-size */
>  
>      void (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
>                            uint64_t *buid, hwaddr *pio, 
> 

-- 
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]