]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Send updated CPU in migration cookie
authorJiri Denemark <jdenemar@redhat.com>
Fri, 26 May 2017 15:06:56 +0000 (17:06 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 7 Jun 2017 11:36:02 +0000 (13:36 +0200)
Since the domain XML send during migration uses the original guest CPU
definition but we still want the destination to enforce ABI if it is new
enough, we send the live updated CPU definition in a migration cookie.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_migration.c
src/qemu/qemu_migration_cookie.c
src/qemu/qemu_migration_cookie.h

index 40564ac63a4306ab59a176bf319c366d2c6565ef..134c76c5e1381f5709534dd26b95dd605e14a09d 100644 (file)
@@ -2020,6 +2020,9 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver,
          vm->newDef && !qemuDomainVcpuHotplugIsInOrder(vm->newDef)))
         cookieFlags |= QEMU_MIGRATION_COOKIE_CPU_HOTPLUG;
 
+    if (priv->origCPU)
+        cookieFlags |= QEMU_MIGRATION_COOKIE_CPU;
+
     if (!(mig = qemuMigrationEatCookie(driver, vm, NULL, 0, 0)))
         goto cleanup;
 
@@ -2644,7 +2647,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
                                        QEMU_MIGRATION_COOKIE_LOCKSTATE |
                                        QEMU_MIGRATION_COOKIE_NBD |
                                        QEMU_MIGRATION_COOKIE_MEMORY_HOTPLUG |
-                                       QEMU_MIGRATION_COOKIE_CPU_HOTPLUG)))
+                                       QEMU_MIGRATION_COOKIE_CPU_HOTPLUG |
+                                       QEMU_MIGRATION_COOKIE_CPU)))
         goto cleanup;
 
     if (STREQ_NULLABLE(protocol, "rdma") &&
index 559b1f0c15d682945dc5176320cf20849927452b..af0ac034189fb236d014e66da874cef20d4d3bc4 100644 (file)
@@ -48,7 +48,8 @@ VIR_ENUM_IMPL(qemuMigrationCookieFlag,
               "nbd",
               "statistics",
               "memory-hotplug",
-              "cpu-hotplug");
+              "cpu-hotplug",
+              "cpu");
 
 
 static void
@@ -109,6 +110,7 @@ qemuMigrationCookieFree(qemuMigrationCookiePtr mig)
     VIR_FREE(mig->lockState);
     VIR_FREE(mig->lockDriver);
     VIR_FREE(mig->jobInfo);
+    virCPUDefFree(mig->cpu);
     VIR_FREE(mig);
 }
 
@@ -519,6 +521,22 @@ qemuMigrationCookieAddStatistics(qemuMigrationCookiePtr mig,
 }
 
 
+static int
+qemuMigrationCookieAddCPU(qemuMigrationCookiePtr mig,
+                          virDomainObjPtr vm)
+{
+    if (mig->cpu)
+        return 0;
+
+    if (!(mig->cpu = virCPUDefCopy(vm->def->cpu)))
+        return -1;
+
+    mig->flags |= QEMU_MIGRATION_COOKIE_CPU;
+
+    return 0;
+}
+
+
 static void
 qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf,
                                      qemuMigrationCookieGraphicsPtr grap)
@@ -755,6 +773,9 @@ qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver,
     if (mig->flags & QEMU_MIGRATION_COOKIE_STATS && mig->jobInfo)
         qemuMigrationCookieStatisticsXMLFormat(buf, mig->jobInfo);
 
+    if (mig->flags & QEMU_MIGRATION_COOKIE_CPU && mig->cpu)
+        virCPUDefFormatBufFull(buf, mig->cpu, NULL, false);
+
     virBufferAdjustIndent(buf, -2);
     virBufferAddLit(buf, "</qemu-migration>\n");
     return 0;
@@ -1198,6 +1219,10 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
         (!(mig->jobInfo = qemuMigrationCookieStatisticsXMLParse(ctxt))))
         goto error;
 
+    if (flags & QEMU_MIGRATION_COOKIE_CPU &&
+        virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &mig->cpu) < 0)
+        goto error;
+
     virObjectUnref(caps);
     return 0;
 
@@ -1274,6 +1299,10 @@ qemuMigrationBakeCookie(qemuMigrationCookiePtr mig,
     if (flags & QEMU_MIGRATION_COOKIE_CPU_HOTPLUG)
         mig->flagsMandatory |= QEMU_MIGRATION_COOKIE_CPU_HOTPLUG;
 
+    if (flags & QEMU_MIGRATION_COOKIE_CPU &&
+        qemuMigrationCookieAddCPU(mig, dom) < 0)
+        return -1;
+
     if (!(*cookieout = qemuMigrationCookieXMLFormatStr(driver, mig)))
         return -1;
 
index b009d5bf5dc06870926c5fe93d777009d631ca2e..e5f3d75a95813c2a93bd1f315be39075d1b13b08 100644 (file)
@@ -28,6 +28,7 @@ typedef enum {
     QEMU_MIGRATION_COOKIE_FLAG_STATS,
     QEMU_MIGRATION_COOKIE_FLAG_MEMORY_HOTPLUG,
     QEMU_MIGRATION_COOKIE_FLAG_CPU_HOTPLUG,
+    QEMU_MIGRATION_COOKIE_FLAG_CPU,
 
     QEMU_MIGRATION_COOKIE_FLAG_LAST
 } qemuMigrationCookieFlags;
@@ -43,6 +44,7 @@ typedef enum {
     QEMU_MIGRATION_COOKIE_STATS = (1 << QEMU_MIGRATION_COOKIE_FLAG_STATS),
     QEMU_MIGRATION_COOKIE_MEMORY_HOTPLUG = (1 << QEMU_MIGRATION_COOKIE_FLAG_MEMORY_HOTPLUG),
     QEMU_MIGRATION_COOKIE_CPU_HOTPLUG = (1 << QEMU_MIGRATION_COOKIE_FLAG_CPU_HOTPLUG),
+    QEMU_MIGRATION_COOKIE_CPU = (1 << QEMU_MIGRATION_COOKIE_FLAG_CPU),
 } qemuMigrationCookieFeatures;
 
 typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics;
@@ -122,6 +124,9 @@ struct _qemuMigrationCookie {
 
     /* If (flags & QEMU_MIGRATION_COOKIE_STATS) */
     qemuDomainJobInfoPtr jobInfo;
+
+    /* If flags & QEMU_MIGRATION_COOKIE_CPU */
+    virCPUDefPtr cpu;
 };