mirror of https://github.com/xemu-project/xemu.git
migration: allow machine to enforce configuration section migration
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>
This commit is contained in:
parent
09b5e30da5
commit
902c053d83
|
@ -312,6 +312,21 @@ static bool machine_get_suppress_vmdesc(Object *obj, Error **errp)
|
||||||
return ms->suppress_vmdesc;
|
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)
|
static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque)
|
||||||
{
|
{
|
||||||
error_report("Option '-device %s' cannot be handled by this machine",
|
error_report("Option '-device %s' cannot be handled by this machine",
|
||||||
|
@ -467,6 +482,12 @@ static void machine_initfn(Object *obj)
|
||||||
object_property_set_description(obj, "suppress-vmdesc",
|
object_property_set_description(obj, "suppress-vmdesc",
|
||||||
"Set on to disable self-describing migration",
|
"Set on to disable self-describing migration",
|
||||||
NULL);
|
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 */
|
/* Register notifier when init is done for sysbus sanity checks */
|
||||||
ms->sysbus_notifier.notify = machine_init_notify;
|
ms->sysbus_notifier.notify = machine_init_notify;
|
||||||
|
|
|
@ -127,6 +127,7 @@ struct MachineState {
|
||||||
char *firmware;
|
char *firmware;
|
||||||
bool iommu;
|
bool iommu;
|
||||||
bool suppress_vmdesc;
|
bool suppress_vmdesc;
|
||||||
|
bool enforce_config_section;
|
||||||
|
|
||||||
ram_addr_t ram_size;
|
ram_addr_t ram_size;
|
||||||
ram_addr_t maxram_size;
|
ram_addr_t maxram_size;
|
||||||
|
|
|
@ -878,13 +878,19 @@ bool qemu_savevm_state_blocked(Error **errp)
|
||||||
return false;
|
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)
|
void qemu_savevm_state_header(QEMUFile *f)
|
||||||
{
|
{
|
||||||
trace_savevm_state_header();
|
trace_savevm_state_header();
|
||||||
qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
|
qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
|
||||||
qemu_put_be32(f, QEMU_VM_FILE_VERSION);
|
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);
|
qemu_put_byte(f, QEMU_VM_CONFIGURATION);
|
||||||
vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
|
vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
|
||||||
}
|
}
|
||||||
|
@ -1883,7 +1889,7 @@ int qemu_loadvm_state(QEMUFile *f)
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!savevm_state.skip_configuration) {
|
if (!savevm_state.skip_configuration || enforce_config_section()) {
|
||||||
if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) {
|
if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) {
|
||||||
error_report("Configuration section missing");
|
error_report("Configuration section missing");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -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"
|
" 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"
|
" 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"
|
" 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)
|
QEMU_ARCH_ALL)
|
||||||
STEXI
|
STEXI
|
||||||
@item -machine [type=]@var{name}[,prop=@var{value}[,...]]
|
@item -machine [type=]@var{name}[,prop=@var{value}[,...]]
|
||||||
|
|
Loading…
Reference in New Issue