6d3351
From 910db8ca0b1a92d8d7ed9763b2ced958142dcaa4 Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <910db8ca0b1a92d8d7ed9763b2ced958142dcaa4@dist-git>
6d3351
From: Jiri Denemark <jdenemar@redhat.com>
6d3351
Date: Fri, 2 Jun 2017 22:52:03 +0200
6d3351
Subject: [PATCH] qemu: Store updated CPU in save cookie
6d3351
6d3351
Since the domain XML saved in a snapshot or saved image uses the
6d3351
original guest CPU definition but we still want to enforce ABI when
6d3351
restoring the domain if libvirt and QEMU are new enough, we save the
6d3351
live updated CPU definition in a save cookie.
6d3351
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
6d3351
(cherry picked from commit 8c19fbf452372c7c1becf987497525ee8b61abbf)
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_domain.c | 22 +++++++++++++++++++---
6d3351
 src/qemu/qemu_domain.h |  2 ++
6d3351
 2 files changed, 21 insertions(+), 3 deletions(-)
6d3351
6d3351
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
6d3351
index 514b56b33c..7897a44634 100644
6d3351
--- a/src/qemu/qemu_domain.c
6d3351
+++ b/src/qemu/qemu_domain.c
6d3351
@@ -9152,12 +9152,15 @@ qemuDomainSaveCookieDispose(void *obj)
6d3351
     qemuDomainSaveCookiePtr cookie = obj;
6d3351
 
6d3351
     VIR_DEBUG("cookie=%p", cookie);
6d3351
+
6d3351
+    virCPUDefFree(cookie->cpu);
6d3351
 }
6d3351
 
6d3351
 
6d3351
 qemuDomainSaveCookiePtr
6d3351
 qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED)
6d3351
 {
6d3351
+    qemuDomainObjPrivatePtr priv = vm->privateData;
6d3351
     qemuDomainSaveCookiePtr cookie = NULL;
6d3351
 
6d3351
     if (qemuDomainInitialize() < 0)
6d3351
@@ -9166,7 +9169,10 @@ qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED)
6d3351
     if (!(cookie = virObjectNew(qemuDomainSaveCookieClass)))
6d3351
         goto error;
6d3351
 
6d3351
-    VIR_DEBUG("Save cookie %p", cookie);
6d3351
+    if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu)))
6d3351
+        goto error;
6d3351
+
6d3351
+    VIR_DEBUG("Save cookie %p, cpu=%p", cookie, cookie->cpu);
6d3351
 
6d3351
     return cookie;
6d3351
 
6d3351
@@ -9188,6 +9194,10 @@ qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
6d3351
     if (!(cookie = virObjectNew(qemuDomainSaveCookieClass)))
6d3351
         goto error;
6d3351
 
6d3351
+    if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST,
6d3351
+                          &cookie->cpu) < 0)
6d3351
+        goto error;
6d3351
+
6d3351
     *obj = (virObjectPtr) cookie;
6d3351
     return 0;
6d3351
 
6d3351
@@ -9198,9 +9208,15 @@ qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
6d3351
 
6d3351
 
6d3351
 static int
6d3351
-qemuDomainSaveCookieFormat(virBufferPtr buf ATTRIBUTE_UNUSED,
6d3351
-                           virObjectPtr obj ATTRIBUTE_UNUSED)
6d3351
+qemuDomainSaveCookieFormat(virBufferPtr buf,
6d3351
+                           virObjectPtr obj)
6d3351
 {
6d3351
+    qemuDomainSaveCookiePtr cookie = (qemuDomainSaveCookiePtr) obj;
6d3351
+
6d3351
+    if (cookie->cpu &&
6d3351
+        virCPUDefFormatBufFull(buf, cookie->cpu, NULL, false) < 0)
6d3351
+        return -1;
6d3351
+
6d3351
     return 0;
6d3351
 }
6d3351
 
6d3351
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
6d3351
index 9567458849..2eea7924fb 100644
6d3351
--- a/src/qemu/qemu_domain.h
6d3351
+++ b/src/qemu/qemu_domain.h
6d3351
@@ -424,6 +424,8 @@ typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie;
6d3351
 typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr;
6d3351
 struct _qemuDomainSaveCookie {
6d3351
     virObject parent;
6d3351
+
6d3351
+    virCPUDefPtr cpu;
6d3351
 };
6d3351
 
6d3351
 qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);
6d3351
-- 
6d3351
2.13.1
6d3351