|
|
3e5111 |
From 9281d9a8d447e8b066cc600f1dcca7775920f01e Mon Sep 17 00:00:00 2001
|
|
|
3e5111 |
Message-Id: <9281d9a8d447e8b066cc600f1dcca7775920f01e@dist-git>
|
|
|
3e5111 |
From: Jiri Denemark <jdenemar@redhat.com>
|
|
|
3e5111 |
Date: Fri, 19 May 2017 15:20:31 +0200
|
|
|
3e5111 |
Subject: [PATCH] qemu: Report the original CPU in migratable xml
|
|
|
3e5111 |
|
|
|
3e5111 |
The destination host may not be able to start a domain using the live
|
|
|
3e5111 |
updated CPU definition because either libvirt or QEMU may not be new
|
|
|
3e5111 |
enough. Thus we need to send the original guest CPU definition.
|
|
|
3e5111 |
|
|
|
3e5111 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
3e5111 |
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
|
|
|
3e5111 |
(cherry picked from commit 356a2161e293eaab57448a8e68f489e0841efe19)
|
|
|
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_domain.c | 61 ++++++++++++++++++++++++++++++++++++++---------
|
|
|
3e5111 |
src/qemu/qemu_domain.h | 1 +
|
|
|
3e5111 |
src/qemu/qemu_driver.c | 13 ++++++----
|
|
|
3e5111 |
src/qemu/qemu_migration.c | 5 ++--
|
|
|
3e5111 |
4 files changed, 63 insertions(+), 17 deletions(-)
|
|
|
3e5111 |
|
|
|
3e5111 |
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
|
|
3e5111 |
index 89fd9f9abc..514b56b33c 100644
|
|
|
3e5111 |
--- a/src/qemu/qemu_domain.c
|
|
|
3e5111 |
+++ b/src/qemu/qemu_domain.c
|
|
|
3e5111 |
@@ -4175,11 +4175,13 @@ qemuDomainDefCopy(virQEMUDriverPtr driver,
|
|
|
3e5111 |
return ret;
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
-int
|
|
|
3e5111 |
-qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
|
|
|
3e5111 |
- virDomainDefPtr def,
|
|
|
3e5111 |
- unsigned int flags,
|
|
|
3e5111 |
- virBuffer *buf)
|
|
|
3e5111 |
+
|
|
|
3e5111 |
+static int
|
|
|
3e5111 |
+qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
|
|
|
3e5111 |
+ virDomainDefPtr def,
|
|
|
3e5111 |
+ virCPUDefPtr origCPU,
|
|
|
3e5111 |
+ unsigned int flags,
|
|
|
3e5111 |
+ virBuffer *buf)
|
|
|
3e5111 |
{
|
|
|
3e5111 |
int ret = -1;
|
|
|
3e5111 |
virDomainDefPtr copy = NULL;
|
|
|
3e5111 |
@@ -4300,6 +4302,16 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
|
|
|
3e5111 |
if (qemuDomainChrDefDropDefaultPath(def->channels[i], driver) < 0)
|
|
|
3e5111 |
goto cleanup;
|
|
|
3e5111 |
}
|
|
|
3e5111 |
+
|
|
|
3e5111 |
+ /* Replace the CPU definition updated according to QEMU with the one
|
|
|
3e5111 |
+ * used for starting the domain. The updated def will be sent
|
|
|
3e5111 |
+ * separately for backward compatibility.
|
|
|
3e5111 |
+ */
|
|
|
3e5111 |
+ if (origCPU) {
|
|
|
3e5111 |
+ virCPUDefFree(def->cpu);
|
|
|
3e5111 |
+ if (!(def->cpu = virCPUDefCopy(origCPU)))
|
|
|
3e5111 |
+ goto cleanup;
|
|
|
3e5111 |
+ }
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
format:
|
|
|
3e5111 |
@@ -4313,13 +4325,26 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
|
|
|
3e5111 |
return ret;
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
-char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
|
|
|
3e5111 |
- virDomainDefPtr def,
|
|
|
3e5111 |
- unsigned int flags)
|
|
|
3e5111 |
+
|
|
|
3e5111 |
+int
|
|
|
3e5111 |
+qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
|
|
|
3e5111 |
+ virDomainDefPtr def,
|
|
|
3e5111 |
+ unsigned int flags,
|
|
|
3e5111 |
+ virBufferPtr buf)
|
|
|
3e5111 |
+{
|
|
|
3e5111 |
+ return qemuDomainDefFormatBufInternal(driver, def, NULL, flags, buf);
|
|
|
3e5111 |
+}
|
|
|
3e5111 |
+
|
|
|
3e5111 |
+
|
|
|
3e5111 |
+static char *
|
|
|
3e5111 |
+qemuDomainDefFormatXMLInternal(virQEMUDriverPtr driver,
|
|
|
3e5111 |
+ virDomainDefPtr def,
|
|
|
3e5111 |
+ virCPUDefPtr origCPU,
|
|
|
3e5111 |
+ unsigned int flags)
|
|
|
3e5111 |
{
|
|
|
3e5111 |
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
|
3e5111 |
|
|
|
3e5111 |
- if (qemuDomainDefFormatBuf(driver, def, flags, &buf) < 0) {
|
|
|
3e5111 |
+ if (qemuDomainDefFormatBufInternal(driver, def, origCPU, flags, &buf) < 0) {
|
|
|
3e5111 |
virBufferFreeAndReset(&buf;;
|
|
|
3e5111 |
return NULL;
|
|
|
3e5111 |
}
|
|
|
3e5111 |
@@ -4333,26 +4358,40 @@ char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
|
|
|
3e5111 |
return virBufferContentAndReset(&buf;;
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
+
|
|
|
3e5111 |
+char *
|
|
|
3e5111 |
+qemuDomainDefFormatXML(virQEMUDriverPtr driver,
|
|
|
3e5111 |
+ virDomainDefPtr def,
|
|
|
3e5111 |
+ unsigned int flags)
|
|
|
3e5111 |
+{
|
|
|
3e5111 |
+ return qemuDomainDefFormatXMLInternal(driver, def, NULL, flags);
|
|
|
3e5111 |
+}
|
|
|
3e5111 |
+
|
|
|
3e5111 |
+
|
|
|
3e5111 |
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
|
|
|
3e5111 |
virDomainObjPtr vm,
|
|
|
3e5111 |
unsigned int flags)
|
|
|
3e5111 |
{
|
|
|
3e5111 |
virDomainDefPtr def;
|
|
|
3e5111 |
+ qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
3e5111 |
+ virCPUDefPtr origCPU = NULL;
|
|
|
3e5111 |
|
|
|
3e5111 |
if ((flags & VIR_DOMAIN_XML_INACTIVE) && vm->newDef) {
|
|
|
3e5111 |
def = vm->newDef;
|
|
|
3e5111 |
} else {
|
|
|
3e5111 |
def = vm->def;
|
|
|
3e5111 |
+ origCPU = priv->origCPU;
|
|
|
3e5111 |
if (virDomainObjIsActive(vm))
|
|
|
3e5111 |
flags &= ~VIR_DOMAIN_XML_UPDATE_CPU;
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
- return qemuDomainDefFormatXML(driver, def, flags);
|
|
|
3e5111 |
+ return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags);
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
char *
|
|
|
3e5111 |
qemuDomainDefFormatLive(virQEMUDriverPtr driver,
|
|
|
3e5111 |
virDomainDefPtr def,
|
|
|
3e5111 |
+ virCPUDefPtr origCPU,
|
|
|
3e5111 |
bool inactive,
|
|
|
3e5111 |
bool compatible)
|
|
|
3e5111 |
{
|
|
|
3e5111 |
@@ -4363,7 +4402,7 @@ qemuDomainDefFormatLive(virQEMUDriverPtr driver,
|
|
|
3e5111 |
if (compatible)
|
|
|
3e5111 |
flags |= VIR_DOMAIN_XML_MIGRATABLE;
|
|
|
3e5111 |
|
|
|
3e5111 |
- return qemuDomainDefFormatXML(driver, def, flags);
|
|
|
3e5111 |
+ return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags);
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
|
|
|
3e5111 |
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
|
|
3e5111 |
index 0c5dad60e1..9567458849 100644
|
|
|
3e5111 |
--- a/src/qemu/qemu_domain.h
|
|
|
3e5111 |
+++ b/src/qemu/qemu_domain.h
|
|
|
3e5111 |
@@ -515,6 +515,7 @@ char *qemuDomainFormatXML(virQEMUDriverPtr driver,
|
|
|
3e5111 |
|
|
|
3e5111 |
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
|
|
|
3e5111 |
virDomainDefPtr def,
|
|
|
3e5111 |
+ virCPUDefPtr origCPU,
|
|
|
3e5111 |
bool inactive,
|
|
|
3e5111 |
bool compatible);
|
|
|
3e5111 |
|
|
|
3e5111 |
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
|
3e5111 |
index dbb1ea9475..f5c5c302be 100644
|
|
|
3e5111 |
--- a/src/qemu/qemu_driver.c
|
|
|
3e5111 |
+++ b/src/qemu/qemu_driver.c
|
|
|
3e5111 |
@@ -3330,9 +3330,9 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
|
|
|
3e5111 |
virDomainDefFree(def);
|
|
|
3e5111 |
goto endjob;
|
|
|
3e5111 |
}
|
|
|
3e5111 |
- xml = qemuDomainDefFormatLive(driver, def, true, true);
|
|
|
3e5111 |
+ xml = qemuDomainDefFormatLive(driver, def, NULL, true, true);
|
|
|
3e5111 |
} else {
|
|
|
3e5111 |
- xml = qemuDomainDefFormatLive(driver, vm->def, true, true);
|
|
|
3e5111 |
+ xml = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU, true, true);
|
|
|
3e5111 |
}
|
|
|
3e5111 |
if (!xml) {
|
|
|
3e5111 |
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
3e5111 |
@@ -14512,7 +14512,8 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
|
|
|
3e5111 |
"snapshot", false)) < 0)
|
|
|
3e5111 |
goto cleanup;
|
|
|
3e5111 |
|
|
|
3e5111 |
- if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)) ||
|
|
|
3e5111 |
+ if (!(xml = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU,
|
|
|
3e5111 |
+ true, true)) ||
|
|
|
3e5111 |
!(snap->def->cookie = (virObjectPtr) qemuDomainSaveCookieNew(vm)))
|
|
|
3e5111 |
goto cleanup;
|
|
|
3e5111 |
|
|
|
3e5111 |
@@ -14623,6 +14624,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
|
|
3e5111 |
bool align_match = true;
|
|
|
3e5111 |
virQEMUDriverConfigPtr cfg = NULL;
|
|
|
3e5111 |
virCapsPtr caps = NULL;
|
|
|
3e5111 |
+ qemuDomainObjPrivatePtr priv;
|
|
|
3e5111 |
|
|
|
3e5111 |
virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
|
|
|
3e5111 |
VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
|
|
|
3e5111 |
@@ -14740,6 +14742,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
|
|
3e5111 |
|
|
|
3e5111 |
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
|
|
|
3e5111 |
|
|
|
3e5111 |
+ priv = vm->privateData;
|
|
|
3e5111 |
+
|
|
|
3e5111 |
if (redefine) {
|
|
|
3e5111 |
if (virDomainSnapshotRedefinePrep(domain, vm, &def, &snap,
|
|
|
3e5111 |
driver->xmlopt,
|
|
|
3e5111 |
@@ -14748,7 +14752,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
|
|
3e5111 |
} else {
|
|
|
3e5111 |
/* Easiest way to clone inactive portion of vm->def is via
|
|
|
3e5111 |
* conversion in and back out of xml. */
|
|
|
3e5111 |
- if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)) ||
|
|
|
3e5111 |
+ if (!(xml = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU,
|
|
|
3e5111 |
+ true, true)) ||
|
|
|
3e5111 |
!(def->dom = virDomainDefParseString(xml, caps, driver->xmlopt, NULL,
|
|
|
3e5111 |
VIR_DOMAIN_DEF_PARSE_INACTIVE |
|
|
|
3e5111 |
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
|
|
|
3e5111 |
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
|
|
3e5111 |
index 5bf9bd10f7..ec5af7a612 100644
|
|
|
3e5111 |
--- a/src/qemu/qemu_migration.c
|
|
|
3e5111 |
+++ b/src/qemu/qemu_migration.c
|
|
|
3e5111 |
@@ -2028,9 +2028,10 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver,
|
|
|
3e5111 |
if (!qemuDomainDefCheckABIStability(driver, vm->def, def))
|
|
|
3e5111 |
goto cleanup;
|
|
|
3e5111 |
|
|
|
3e5111 |
- rv = qemuDomainDefFormatLive(driver, def, false, true);
|
|
|
3e5111 |
+ rv = qemuDomainDefFormatLive(driver, def, NULL, false, true);
|
|
|
3e5111 |
} else {
|
|
|
3e5111 |
- rv = qemuDomainDefFormatLive(driver, vm->def, false, true);
|
|
|
3e5111 |
+ rv = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU,
|
|
|
3e5111 |
+ false, true);
|
|
|
3e5111 |
}
|
|
|
3e5111 |
|
|
|
3e5111 |
cleanup:
|
|
|
3e5111 |
--
|
|
|
3e5111 |
2.13.1
|
|
|
3e5111 |
|