[libvirt] [PATCH] qemu: Fix (managed)save and snapshots with host mode CPU

When host-model and host-passthrouh CPU modes were introduced, qemu driver was properly modify to update guest CPU definition during migration so that we use the right CPU at the destination. However, similar treatment is needed for (managed)save and snapshots since they need to save the exact CPU so that a domain can be properly restored. To avoid repetition of such situation, all places that need live XML share the code which generates it. As a side effect, this patch fixes error reporting from qemuDomainSnapshotWriteMetadata(). --- src/conf/domain_conf.c | 3 ++- src/qemu/qemu_domain.c | 23 +++++++++++++++++++---- src/qemu/qemu_domain.h | 4 ++++ src/qemu/qemu_driver.c | 9 +++------ src/qemu/qemu_migration.c | 8 ++------ 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b185fe7..01bd56b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13561,7 +13561,8 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid, virBuffer buf = VIR_BUFFER_INITIALIZER; int i; - virCheckFlags(VIR_DOMAIN_XML_SECURE, NULL); + virCheckFlags(VIR_DOMAIN_XML_SECURE | + VIR_DOMAIN_XML_UPDATE_CPU, NULL); flags |= VIR_DOMAIN_XML_INACTIVE; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2fed91e..f8b7c96 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -47,6 +47,10 @@ #define QEMU_NAMESPACE_HREF "http://libvirt.org/schemas/domain/qemu/1.0" +#define QEMU_DOMAIN_FORMAT_LIVE_FLAGS \ + (VIR_DOMAIN_XML_SECURE | \ + VIR_DOMAIN_XML_UPDATE_CPU) + VIR_ENUM_DECL(qemuDomainJob) VIR_ENUM_IMPL(qemuDomainJob, QEMU_JOB_LAST, "none", @@ -1192,6 +1196,19 @@ char *qemuDomainFormatXML(struct qemud_driver *driver, return qemuDomainDefFormatXML(driver, def, flags); } +char * +qemuDomainDefFormatLive(struct qemud_driver *driver, + virDomainDefPtr def, + bool inactive) +{ + unsigned int flags = QEMU_DOMAIN_FORMAT_LIVE_FLAGS; + + if (inactive) + flags |= VIR_DOMAIN_XML_INACTIVE; + + return qemuDomainDefFormatXML(driver, def, flags); +} + void qemuDomainObjTaint(struct qemud_driver *driver, virDomainObjPtr obj, @@ -1436,11 +1453,9 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, virUUIDFormat(vm->def->uuid, uuidstr); newxml = virDomainSnapshotDefFormat(uuidstr, snapshot->def, - VIR_DOMAIN_XML_SECURE, 1); - if (newxml == NULL) { - virReportOOMError(); + QEMU_DOMAIN_FORMAT_LIVE_FLAGS, 1); + if (newxml == NULL) return -1; - } if (virAsprintf(&snapDir, "%s/%s", snapshotDir, vm->def->name) < 0) { virReportOOMError(); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 1333d8c..f8e943f 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -232,6 +232,10 @@ char *qemuDomainFormatXML(struct qemud_driver *driver, virDomainObjPtr vm, unsigned int flags); +char *qemuDomainDefFormatLive(struct qemud_driver *driver, + virDomainDefPtr def, + bool inactive); + void qemuDomainObjTaint(struct qemud_driver *driver, virDomainObjPtr obj, enum virDomainTaintFlags taint, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index be678f3..55f389f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2584,11 +2584,9 @@ qemuDomainSaveInternal(struct qemud_driver *driver, virDomainPtr dom, virDomainDefFree(def); goto endjob; } - xml = virDomainDefFormat(def, (VIR_DOMAIN_XML_INACTIVE | - VIR_DOMAIN_XML_SECURE)); + xml = qemuDomainDefFormatLive(driver, def, true); } else { - xml = virDomainDefFormat(vm->def, (VIR_DOMAIN_XML_INACTIVE | - VIR_DOMAIN_XML_SECURE)); + xml = qemuDomainDefFormatLive(driver, vm->def, true); } if (!xml) { qemuReportError(VIR_ERR_OPERATION_FAILED, @@ -10170,8 +10168,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, } else { /* Easiest way to clone inactive portion of vm->def is via * conversion in and back out of xml. */ - if (!(xml = virDomainDefFormat(vm->def, (VIR_DOMAIN_XML_INACTIVE | - VIR_DOMAIN_XML_SECURE))) || + if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true)) || !(def->dom = virDomainDefParseString(driver->caps, xml, QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 92d046a..81b2d5b 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1092,13 +1092,9 @@ char *qemuMigrationBegin(struct qemud_driver *driver, if (!virDomainDefCheckABIStability(vm->def, def)) goto cleanup; - rv = qemuDomainDefFormatXML(driver, def, - VIR_DOMAIN_XML_SECURE | - VIR_DOMAIN_XML_UPDATE_CPU); + rv = qemuDomainDefFormatLive(driver, def, false); } else { - rv = qemuDomainFormatXML(driver, vm, - VIR_DOMAIN_XML_SECURE | - VIR_DOMAIN_XML_UPDATE_CPU); + rv = qemuDomainDefFormatLive(driver, vm->def, false); } cleanup: -- 1.7.8.5

On 03/12/2012 08:31 AM, Jiri Denemark wrote:
When host-model and host-passthrouh CPU modes were introduced, qemu driver was properly modify to update guest CPU definition during migration so that we use the right CPU at the destination. However, similar treatment is needed for (managed)save and snapshots since they need to save the exact CPU so that a domain can be properly restored. To avoid repetition of such situation, all places that need live XML share the code which generates it.
As a side effect, this patch fixes error reporting from qemuDomainSnapshotWriteMetadata(). --- src/conf/domain_conf.c | 3 ++- src/qemu/qemu_domain.c | 23 +++++++++++++++++++---- src/qemu/qemu_domain.h | 4 ++++ src/qemu/qemu_driver.c | 9 +++------ src/qemu/qemu_migration.c | 8 ++------ 5 files changed, 30 insertions(+), 17 deletions(-)
I haven't tested this as much as I'd like, but by inspection, it looks right, and I'd rather get it in now so we maximize our testing time. ACK. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Mon, Mar 12, 2012 at 17:32:45 -0600, Eric Blake wrote:
On 03/12/2012 08:31 AM, Jiri Denemark wrote:
When host-model and host-passthrouh CPU modes were introduced, qemu driver was properly modify to update guest CPU definition during migration so that we use the right CPU at the destination. However, similar treatment is needed for (managed)save and snapshots since they need to save the exact CPU so that a domain can be properly restored. To avoid repetition of such situation, all places that need live XML share the code which generates it.
As a side effect, this patch fixes error reporting from qemuDomainSnapshotWriteMetadata(). --- src/conf/domain_conf.c | 3 ++- src/qemu/qemu_domain.c | 23 +++++++++++++++++++---- src/qemu/qemu_domain.h | 4 ++++ src/qemu/qemu_driver.c | 9 +++------ src/qemu/qemu_migration.c | 8 ++------ 5 files changed, 30 insertions(+), 17 deletions(-)
I haven't tested this as much as I'd like, but by inspection, it looks right, and I'd rather get it in now so we maximize our testing time.
I tested managedsave and basic snapshot of a running domain and all was working fine. However, snapshots are so complicated I didn't even try to test all possibilities there.
ACK.
Thanks and pushed. Jirka
participants (2)
-
Eric Blake
-
Jiri Denemark