On Mon, 15 Feb 2016 12:23:39 +0100 Laurent Vivier <lviv...@redhat.com> wrote:
> On 15/02/2016 11:15, Greg Kurz wrote: > > Since QEMU 2.4, the migration stream begins with a configuration section. > > It is known to break migration of pseries machine from older QEMU. It is > > possible to fix this in the pseries compat code but it will then break > > migration of old pseries from latest QEMU. > > > > As an alternative, this patch introduces a new machine property which > > allows to ignore the abscence of configuration section during incoming > > migration. It boils to adding: > > > > -machine config-section=off > > > > Using this property only makes sense when migrating from an older > > QEMU. It has no effect on outgoing migration. > > I think this is not true: migrating a pseries-2.3 machine from a > qemu-2.4 to a qemu-2.3 must not send the configuration section because > the qemu-2.3 will not be able to decode it. > I did not mind to also fix backward compatibility... is it mandatory ? > 2016-02-15T11:22:08.645978Z qemu-system-ppc64: Unknown savevm section type 7 > 2016-02-15T11:22:08.646041Z qemu-system-ppc64: load of migration failed: > Invalid argument > > [This is the result without your patch] > > Laurent > > > > Suggested-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > > Reviewed-by: David Gibson <da...@gibson.dropbear.id.au> > > Signed-off-by: Greg Kurz <gk...@linux.vnet.ibm.com> > > --- > > hw/core/machine.c | 21 +++++++++++++++++++++ > > include/hw/boards.h | 1 + > > migration/savevm.c | 21 +++++++++++++++------ > > qemu-options.hx | 3 ++- > > 4 files changed, 39 insertions(+), 7 deletions(-) > > > > diff --git a/hw/core/machine.c b/hw/core/machine.c > > index 6d1a0d8eebc4..4a7322988fb5 100644 > > --- a/hw/core/machine.c > > +++ b/hw/core/machine.c > > @@ -312,6 +312,20 @@ static bool machine_get_suppress_vmdesc(Object *obj, > > Error **errp) > > return ms->suppress_vmdesc; > > } > > > > +static void machine_set_config_section(Object *obj, bool value, Error > > **errp) > > +{ > > + MachineState *ms = MACHINE(obj); > > + > > + ms->config_section = value; > > +} > > + > > +static bool machine_get_config_section(Object *obj, Error **errp) > > +{ > > + MachineState *ms = MACHINE(obj); > > + > > + return ms->config_section; > > +} > > + > > static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque) > > { > > error_report("Option '-device %s' cannot be handled by this machine", > > @@ -365,6 +379,7 @@ static void machine_initfn(Object *obj) > > ms->kvm_shadow_mem = -1; > > ms->dump_guest_core = true; > > ms->mem_merge = true; > > + ms->config_section = true; > > > > object_property_add_str(obj, "accel", > > machine_get_accel, machine_set_accel, NULL); > > @@ -467,6 +482,12 @@ static void machine_initfn(Object *obj) > > object_property_set_description(obj, "suppress-vmdesc", > > "Set on to disable self-describing > > migration", > > NULL); > > + object_property_add_bool(obj, "config-section", > > + machine_get_config_section, > > + machine_set_config_section, NULL); > > + object_property_set_description(obj, "config-section", > > + "Set on/off to accept migration > > with/without configuration section", > > + NULL); > > > > /* Register notifier when init is done for sysbus sanity checks */ > > ms->sysbus_notifier.notify = machine_init_notify; > > diff --git a/include/hw/boards.h b/include/hw/boards.h > > index 0f30959e2e3b..853bb5905ec1 100644 > > --- a/include/hw/boards.h > > +++ b/include/hw/boards.h > > @@ -128,6 +128,7 @@ struct MachineState { > > char *firmware; > > bool iommu; > > bool suppress_vmdesc; > > + bool config_section; > > > > ram_addr_t ram_size; > > ram_addr_t maxram_size; > > diff --git a/migration/savevm.c b/migration/savevm.c > > index 94f2894243ce..3795489aeaec 100644 > > --- a/migration/savevm.c > > +++ b/migration/savevm.c > > @@ -1847,6 +1847,12 @@ static int qemu_loadvm_state_main(QEMUFile *f, > > MigrationIncomingState *mis) > > return 0; > > } > > > > +static bool must_receive_configuration(void) > > +{ > > + MachineState *machine = MACHINE(qdev_get_machine()); > > + return machine->config_section; > > +} > > + > > int qemu_loadvm_state(QEMUFile *f) > > { > > MigrationIncomingState *mis = migration_incoming_get_current(); > > @@ -1876,15 +1882,18 @@ int qemu_loadvm_state(QEMUFile *f) > > } > > > > if (!savevm_state.skip_configuration) { > > - if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) { > > + if (qemu_peek_byte(f, 0) == QEMU_VM_CONFIGURATION) { > > + qemu_file_skip(f, 1); > > + ret = vmstate_load_state(f, &vmstate_configuration, > > &savevm_state, > > + 0); > > + > > + if (ret) { > > + return ret; > > + } > > + } else if (must_receive_configuration()) { > > error_report("Configuration section missing"); > > return -EINVAL; > > } > > - ret = vmstate_load_state(f, &vmstate_configuration, &savevm_state, > > 0); > > - > > - if (ret) { > > - return ret; > > - } > > } > > > > ret = qemu_loadvm_state_main(f, mis); > > diff --git a/qemu-options.hx b/qemu-options.hx > > index 2f0465eeb1d1..10cd64dc266b 100644 > > --- a/qemu-options.hx > > +++ b/qemu-options.hx > > @@ -43,7 +43,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > > " aes-key-wrap=on|off controls support for AES key > > wrapping (default=on)\n" > > " dea-key-wrap=on|off controls support for DEA key > > wrapping (default=on)\n" > > " suppress-vmdesc=on|off disables self-describing > > migration (default=off)\n" > > - " nvdimm=on|off controls NVDIMM support > > (default=off)\n", > > + " nvdimm=on|off controls NVDIMM support (default=off)\n" > > + " config-section=on|off migration requires > > configuration section (default=on)\n", > > QEMU_ARCH_ALL) > > STEXI > > @item -machine [type=]@var{name}[,prop=@var{value}[,...]] > > > > >