3e5111
From f4038af76b0b8b4f8fb7b4ea7e957a6eb0614ea5 Mon Sep 17 00:00:00 2001
3e5111
Message-Id: <f4038af76b0b8b4f8fb7b4ea7e957a6eb0614ea5@dist-git>
3e5111
From: Jiri Denemark <jdenemar@redhat.com>
3e5111
Date: Tue, 16 May 2017 13:26:54 +0200
3e5111
Subject: [PATCH] qemu: Remember CPU def from domain start
3e5111
3e5111
When starting a domain we update the guest CPU definition to match what
3e5111
QEMU actually provided (since it is allowed to add or removed some
3e5111
features unless check='full' is specified). Let's store the original CPU
3e5111
in domain private data so that we can use it to provide a backward
3e5111
compatible domain XML.
3e5111
3e5111
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
3e5111
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
3e5111
(cherry picked from commit ea6d89831198ae1854dca15b2bcf081df2d866a2)
3e5111
3e5111
https://bugzilla.redhat.com/show_bug.cgi?id=1441662
3e5111
3e5111
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
3e5111
---
3e5111
 src/libvirt_private.syms |  2 ++
3e5111
 src/qemu/qemu_domain.c   |  7 +++++++
3e5111
 src/qemu/qemu_domain.h   |  4 ++++
3e5111
 src/qemu/qemu_process.c  | 13 +++++++++++--
3e5111
 4 files changed, 24 insertions(+), 2 deletions(-)
3e5111
3e5111
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
3e5111
index 88e3f4b8ac..8c088316c4 100644
3e5111
--- a/src/libvirt_private.syms
3e5111
+++ b/src/libvirt_private.syms
3e5111
@@ -76,9 +76,11 @@ virCPUDefCopyModelFilter;
3e5111
 virCPUDefCopyWithoutModel;
3e5111
 virCPUDefFormat;
3e5111
 virCPUDefFormatBuf;
3e5111
+virCPUDefFormatBufFull;
3e5111
 virCPUDefFree;
3e5111
 virCPUDefFreeFeatures;
3e5111
 virCPUDefFreeModel;
3e5111
+virCPUDefIsEqual;
3e5111
 virCPUDefParseXML;
3e5111
 virCPUDefStealModel;
3e5111
 virCPUDefUpdateFeature;
3e5111
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
3e5111
index 63fcde8024..89fd9f9abc 100644
3e5111
--- a/src/qemu/qemu_domain.c
3e5111
+++ b/src/qemu/qemu_domain.c
3e5111
@@ -1705,6 +1705,8 @@ qemuDomainObjPrivateFree(void *data)
3e5111
     VIR_FREE(priv->migTLSAlias);
3e5111
     qemuDomainMasterKeyFree(priv);
3e5111
 
3e5111
+    virCPUDefFree(priv->origCPU);
3e5111
+
3e5111
     VIR_FREE(priv);
3e5111
 }
3e5111
 
3e5111
@@ -1860,6 +1862,8 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
3e5111
     virBufferEscapeString(buf, "<channelTargetDir path='%s'/>\n",
3e5111
                           priv->channelTargetDir);
3e5111
 
3e5111
+    virCPUDefFormatBufFull(buf, priv->origCPU, NULL, false);
3e5111
+
3e5111
     return 0;
3e5111
 }
3e5111
 
3e5111
@@ -2128,6 +2132,9 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
3e5111
     if (qemuDomainSetPrivatePathsOld(driver, vm) < 0)
3e5111
         goto error;
3e5111
 
3e5111
+    if (virCPUDefParseXML(ctxt, "./cpu", VIR_CPU_TYPE_GUEST, &priv->origCPU) < 0)
3e5111
+        goto error;
3e5111
+
3e5111
     return 0;
3e5111
 
3e5111
  error:
3e5111
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
3e5111
index 80d80e4554..0c5dad60e1 100644
3e5111
--- a/src/qemu/qemu_domain.h
3e5111
+++ b/src/qemu/qemu_domain.h
3e5111
@@ -293,6 +293,10 @@ struct _qemuDomainObjPrivate {
3e5111
     /* Used when fetching/storing the current 'tls-creds' migration setting */
3e5111
     /* (not to be saved in our private XML). */
3e5111
     char *migTLSAlias;
3e5111
+
3e5111
+    /* CPU def used to start the domain when it differs from the one actually
3e5111
+     * provided by QEMU. */
3e5111
+    virCPUDefPtr origCPU;
3e5111
 };
3e5111
 
3e5111
 # define QEMU_DOMAIN_PRIVATE(vm)	\
3e5111
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
3e5111
index 7e51ca819a..79f780ed46 100644
3e5111
--- a/src/qemu/qemu_process.c
3e5111
+++ b/src/qemu/qemu_process.c
3e5111
@@ -3915,6 +3915,7 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver,
3e5111
     qemuDomainObjPrivatePtr priv = vm->privateData;
3e5111
     int rc;
3e5111
     int ret = -1;
3e5111
+    virCPUDefPtr orig = NULL;
3e5111
 
3e5111
     if (ARCH_IS_X86(def->os.arch)) {
3e5111
         if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
3e5111
@@ -3945,10 +3946,17 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver,
3e5111
         if (qemuProcessVerifyCPUFeatures(def, cpu) < 0)
3e5111
             goto cleanup;
3e5111
 
3e5111
-        if ((rc = virCPUUpdateLive(def->os.arch, def->cpu, cpu, disabled)) < 0)
3e5111
+        if (!(orig = virCPUDefCopy(def->cpu)))
3e5111
             goto cleanup;
3e5111
-        else if (rc == 0)
3e5111
+
3e5111
+        if ((rc = virCPUUpdateLive(def->os.arch, def->cpu, cpu, disabled)) < 0) {
3e5111
+            goto cleanup;
3e5111
+        } else if (rc == 0) {
3e5111
+            if (!virCPUDefIsEqual(def->cpu, orig, false))
3e5111
+                VIR_STEAL_PTR(priv->origCPU, orig);
3e5111
+
3e5111
             def->cpu->check = VIR_CPU_CHECK_FULL;
3e5111
+        }
3e5111
     }
3e5111
 
3e5111
     ret = 0;
3e5111
@@ -3956,6 +3964,7 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver,
3e5111
  cleanup:
3e5111
     virCPUDataFree(cpu);
3e5111
     virCPUDataFree(disabled);
3e5111
+    virCPUDefFree(orig);
3e5111
     return ret;
3e5111
 }
3e5111
 
3e5111
-- 
3e5111
2.13.1
3e5111