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