diff mbox

[v2,1/3] migration: allow configuration section to be optional

Message ID 20160217160350.840.2508.stgit@bahia.huguette.org (mailing list archive)
State New, archived
Headers show

Commit Message

Greg Kurz Feb. 17, 2016, 4:05 p.m. UTC
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 require-config-section=off

Using this property only makes sense when migrating from an older
QEMU. It has no effect on outgoing migration.

Suggested-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
---
v2: - renamed property to require-config-section
---
 hw/core/machine.c   |   22 ++++++++++++++++++++++
 include/hw/boards.h |    1 +
 migration/savevm.c  |   21 +++++++++++++++------
 qemu-options.hx     |    3 ++-
 4 files changed, 40 insertions(+), 7 deletions(-)
diff mbox

Patch

diff --git a/hw/core/machine.c b/hw/core/machine.c
index 6d1a0d8eebc4..7203dd260bf2 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -312,6 +312,21 @@  static bool machine_get_suppress_vmdesc(Object *obj, Error **errp)
     return ms->suppress_vmdesc;
 }
 
+static void machine_set_require_config_section(Object *obj, bool value,
+                                               Error **errp)
+{
+    MachineState *ms = MACHINE(obj);
+
+    ms->require_config_section = value;
+}
+
+static bool machine_get_require_config_section(Object *obj, Error **errp)
+{
+    MachineState *ms = MACHINE(obj);
+
+    return ms->require_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 +380,7 @@  static void machine_initfn(Object *obj)
     ms->kvm_shadow_mem = -1;
     ms->dump_guest_core = true;
     ms->mem_merge = true;
+    ms->require_config_section = true;
 
     object_property_add_str(obj, "accel",
                             machine_get_accel, machine_set_accel, NULL);
@@ -467,6 +483,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, "require-config-section",
+                             machine_get_require_config_section,
+                             machine_set_require_config_section, NULL);
+    object_property_set_description(obj, "require-config-section",
+                                    "Set on/off to reject/accept migration 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..d6ff1ba4c260 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 require_config_section;
 
     ram_addr_t ram_size;
     ram_addr_t maxram_size;
diff --git a/migration/savevm.c b/migration/savevm.c
index 94f2894243ce..f8dee03a3350 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->require_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..172471c75b1c 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"
+    "                require-config-section=on|off incoming migration requires configuration section (default=on)\n",
     QEMU_ARCH_ALL)
 STEXI
 @item -machine [type=]@var{name}[,prop=@var{value}[,...]]