6d3351
From f33ea433e58c5fbd356d4085446a64f8a67496e5 Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <f33ea433e58c5fbd356d4085446a64f8a67496e5@dist-git>
6d3351
From: Jiri Denemark <jdenemar@redhat.com>
6d3351
Date: Fri, 26 May 2017 17:06:56 +0200
6d3351
Subject: [PATCH] qemu: Send updated CPU in migration cookie
6d3351
6d3351
Since the domain XML send during migration uses the original guest CPU
6d3351
definition but we still want the destination to enforce ABI if it is new
6d3351
enough, we send the live updated CPU definition in a migration cookie.
6d3351
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
6d3351
(cherry picked from commit 48bc3053b8f2bfa3adc93d3c316d48d0f482cde4)
6d3351
6d3351
https://bugzilla.redhat.com/show_bug.cgi?id=1441662
6d3351
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
---
6d3351
 src/qemu/qemu_migration.c        |  6 +++++-
6d3351
 src/qemu/qemu_migration_cookie.c | 31 ++++++++++++++++++++++++++++++-
6d3351
 src/qemu/qemu_migration_cookie.h |  5 +++++
6d3351
 3 files changed, 40 insertions(+), 2 deletions(-)
6d3351
6d3351
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
6d3351
index a7c90a09e8..c03f1be575 100644
6d3351
--- a/src/qemu/qemu_migration.c
6d3351
+++ b/src/qemu/qemu_migration.c
6d3351
@@ -1989,6 +1989,9 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver,
6d3351
          vm->newDef && !qemuDomainVcpuHotplugIsInOrder(vm->newDef)))
6d3351
         cookieFlags |= QEMU_MIGRATION_COOKIE_CPU_HOTPLUG;
6d3351
 
6d3351
+    if (priv->origCPU)
6d3351
+        cookieFlags |= QEMU_MIGRATION_COOKIE_CPU;
6d3351
+
6d3351
     if (!(mig = qemuMigrationEatCookie(driver, vm, NULL, 0, 0)))
6d3351
         goto cleanup;
6d3351
 
6d3351
@@ -2613,7 +2616,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
6d3351
                                        QEMU_MIGRATION_COOKIE_LOCKSTATE |
6d3351
                                        QEMU_MIGRATION_COOKIE_NBD |
6d3351
                                        QEMU_MIGRATION_COOKIE_MEMORY_HOTPLUG |
6d3351
-                                       QEMU_MIGRATION_COOKIE_CPU_HOTPLUG)))
6d3351
+                                       QEMU_MIGRATION_COOKIE_CPU_HOTPLUG |
6d3351
+                                       QEMU_MIGRATION_COOKIE_CPU)))
6d3351
         goto cleanup;
6d3351
 
6d3351
     if (STREQ_NULLABLE(protocol, "rdma") &&
6d3351
diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c
6d3351
index 559b1f0c15..af0ac03418 100644
6d3351
--- a/src/qemu/qemu_migration_cookie.c
6d3351
+++ b/src/qemu/qemu_migration_cookie.c
6d3351
@@ -48,7 +48,8 @@ VIR_ENUM_IMPL(qemuMigrationCookieFlag,
6d3351
               "nbd",
6d3351
               "statistics",
6d3351
               "memory-hotplug",
6d3351
-              "cpu-hotplug");
6d3351
+              "cpu-hotplug",
6d3351
+              "cpu");
6d3351
 
6d3351
 
6d3351
 static void
6d3351
@@ -109,6 +110,7 @@ qemuMigrationCookieFree(qemuMigrationCookiePtr mig)
6d3351
     VIR_FREE(mig->lockState);
6d3351
     VIR_FREE(mig->lockDriver);
6d3351
     VIR_FREE(mig->jobInfo);
6d3351
+    virCPUDefFree(mig->cpu);
6d3351
     VIR_FREE(mig);
6d3351
 }
6d3351
 
6d3351
@@ -519,6 +521,22 @@ qemuMigrationCookieAddStatistics(qemuMigrationCookiePtr mig,
6d3351
 }
6d3351
 
6d3351
 
6d3351
+static int
6d3351
+qemuMigrationCookieAddCPU(qemuMigrationCookiePtr mig,
6d3351
+                          virDomainObjPtr vm)
6d3351
+{
6d3351
+    if (mig->cpu)
6d3351
+        return 0;
6d3351
+
6d3351
+    if (!(mig->cpu = virCPUDefCopy(vm->def->cpu)))
6d3351
+        return -1;
6d3351
+
6d3351
+    mig->flags |= QEMU_MIGRATION_COOKIE_CPU;
6d3351
+
6d3351
+    return 0;
6d3351
+}
6d3351
+
6d3351
+
6d3351
 static void
6d3351
 qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf,
6d3351
                                      qemuMigrationCookieGraphicsPtr grap)
6d3351
@@ -755,6 +773,9 @@ qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver,
6d3351
     if (mig->flags & QEMU_MIGRATION_COOKIE_STATS && mig->jobInfo)
6d3351
         qemuMigrationCookieStatisticsXMLFormat(buf, mig->jobInfo);
6d3351
 
6d3351
+    if (mig->flags & QEMU_MIGRATION_COOKIE_CPU && mig->cpu)
6d3351
+        virCPUDefFormatBufFull(buf, mig->cpu, NULL, false);
6d3351
+
6d3351
     virBufferAdjustIndent(buf, -2);
6d3351
     virBufferAddLit(buf, "</qemu-migration>\n");
6d3351
     return 0;
6d3351
@@ -1198,6 +1219,10 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
6d3351
         (!(mig->jobInfo = qemuMigrationCookieStatisticsXMLParse(ctxt))))
6d3351
         goto error;
6d3351
 
6d3351
+    if (flags & QEMU_MIGRATION_COOKIE_CPU &&
6d3351
+        virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &mig->cpu) < 0)
6d3351
+        goto error;
6d3351
+
6d3351
     virObjectUnref(caps);
6d3351
     return 0;
6d3351
 
6d3351
@@ -1274,6 +1299,10 @@ qemuMigrationBakeCookie(qemuMigrationCookiePtr mig,
6d3351
     if (flags & QEMU_MIGRATION_COOKIE_CPU_HOTPLUG)
6d3351
         mig->flagsMandatory |= QEMU_MIGRATION_COOKIE_CPU_HOTPLUG;
6d3351
 
6d3351
+    if (flags & QEMU_MIGRATION_COOKIE_CPU &&
6d3351
+        qemuMigrationCookieAddCPU(mig, dom) < 0)
6d3351
+        return -1;
6d3351
+
6d3351
     if (!(*cookieout = qemuMigrationCookieXMLFormatStr(driver, mig)))
6d3351
         return -1;
6d3351
 
6d3351
diff --git a/src/qemu/qemu_migration_cookie.h b/src/qemu/qemu_migration_cookie.h
6d3351
index b009d5bf5d..e5f3d75a95 100644
6d3351
--- a/src/qemu/qemu_migration_cookie.h
6d3351
+++ b/src/qemu/qemu_migration_cookie.h
6d3351
@@ -28,6 +28,7 @@ typedef enum {
6d3351
     QEMU_MIGRATION_COOKIE_FLAG_STATS,
6d3351
     QEMU_MIGRATION_COOKIE_FLAG_MEMORY_HOTPLUG,
6d3351
     QEMU_MIGRATION_COOKIE_FLAG_CPU_HOTPLUG,
6d3351
+    QEMU_MIGRATION_COOKIE_FLAG_CPU,
6d3351
 
6d3351
     QEMU_MIGRATION_COOKIE_FLAG_LAST
6d3351
 } qemuMigrationCookieFlags;
6d3351
@@ -43,6 +44,7 @@ typedef enum {
6d3351
     QEMU_MIGRATION_COOKIE_STATS = (1 << QEMU_MIGRATION_COOKIE_FLAG_STATS),
6d3351
     QEMU_MIGRATION_COOKIE_MEMORY_HOTPLUG = (1 << QEMU_MIGRATION_COOKIE_FLAG_MEMORY_HOTPLUG),
6d3351
     QEMU_MIGRATION_COOKIE_CPU_HOTPLUG = (1 << QEMU_MIGRATION_COOKIE_FLAG_CPU_HOTPLUG),
6d3351
+    QEMU_MIGRATION_COOKIE_CPU = (1 << QEMU_MIGRATION_COOKIE_FLAG_CPU),
6d3351
 } qemuMigrationCookieFeatures;
6d3351
 
6d3351
 typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics;
6d3351
@@ -122,6 +124,9 @@ struct _qemuMigrationCookie {
6d3351
 
6d3351
     /* If (flags & QEMU_MIGRATION_COOKIE_STATS) */
6d3351
     qemuDomainJobInfoPtr jobInfo;
6d3351
+
6d3351
+    /* If flags & QEMU_MIGRATION_COOKIE_CPU */
6d3351
+    virCPUDefPtr cpu;
6d3351
 };
6d3351
 
6d3351
 
6d3351
-- 
6d3351
2.13.1
6d3351