Skip to content

Commit

Permalink
migration: allow machine to enforce configuration section migration
Browse files Browse the repository at this point in the history
Migration of pseries-2.3 doesn't have configuration section. Unfortunately,
QEMU 2.4/2.4.1/2.5 are buggy and always stream and expect the configuration
section, and break migration both ways.

This patch introduces a property which allows to enforce a configuration
section for machines who don't have one.

It can be set at startup:

-machine enforce-config-section=on

or later from the QEMU monitor:

qom-set /machine enforce-config-section on

It is up to the tooling to set or unset this property according to the
version of the QEMU at the other end of the pipe.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
  • Loading branch information
gkurz authored and dgibson committed Feb 28, 2016
1 parent 09b5e30 commit 902c053
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 3 deletions.
21 changes: 21 additions & 0 deletions hw/core/machine.c
Expand Up @@ -312,6 +312,21 @@ static bool machine_get_suppress_vmdesc(Object *obj, Error **errp)
return ms->suppress_vmdesc;
}

static void machine_set_enforce_config_section(Object *obj, bool value,
Error **errp)
{
MachineState *ms = MACHINE(obj);

ms->enforce_config_section = value;
}

static bool machine_get_enforce_config_section(Object *obj, Error **errp)
{
MachineState *ms = MACHINE(obj);

return ms->enforce_config_section;
}

static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque)
{
error_report("Option '-device %s' cannot be handled by this machine",
Expand Down Expand Up @@ -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, "enforce-config-section",
machine_get_enforce_config_section,
machine_set_enforce_config_section, NULL);
object_property_set_description(obj, "enforce-config-section",
"Set on to enforce configuration section migration",
NULL);

/* Register notifier when init is done for sysbus sanity checks */
ms->sysbus_notifier.notify = machine_init_notify;
Expand Down
1 change: 1 addition & 0 deletions include/hw/boards.h
Expand Up @@ -127,6 +127,7 @@ struct MachineState {
char *firmware;
bool iommu;
bool suppress_vmdesc;
bool enforce_config_section;

ram_addr_t ram_size;
ram_addr_t maxram_size;
Expand Down
10 changes: 8 additions & 2 deletions migration/savevm.c
Expand Up @@ -878,13 +878,19 @@ bool qemu_savevm_state_blocked(Error **errp)
return false;
}

static bool enforce_config_section(void)
{
MachineState *machine = MACHINE(qdev_get_machine());
return machine->enforce_config_section;
}

void qemu_savevm_state_header(QEMUFile *f)
{
trace_savevm_state_header();
qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
qemu_put_be32(f, QEMU_VM_FILE_VERSION);

if (!savevm_state.skip_configuration) {
if (!savevm_state.skip_configuration || enforce_config_section()) {
qemu_put_byte(f, QEMU_VM_CONFIGURATION);
vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
}
Expand Down Expand Up @@ -1883,7 +1889,7 @@ int qemu_loadvm_state(QEMUFile *f)
return -ENOTSUP;
}

if (!savevm_state.skip_configuration) {
if (!savevm_state.skip_configuration || enforce_config_section()) {
if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) {
error_report("Configuration section missing");
return -EINVAL;
Expand Down
3 changes: 2 additions & 1 deletion qemu-options.hx
Expand Up @@ -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"
" enforce-config-section=on|off enforce configuration section migration (default=off)\n",
QEMU_ARCH_ALL)
STEXI
@item -machine [type=]@var{name}[,prop=@var{value}[,...]]
Expand Down

0 comments on commit 902c053

Please sign in to comment.