]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Remember CPU def from domain start
authorJiri Denemark <jdenemar@redhat.com>
Tue, 16 May 2017 11:26:54 +0000 (13:26 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 7 Jun 2017 11:36:02 +0000 (13:36 +0200)
When starting a domain we update the guest CPU definition to match what
QEMU actually provided (since it is allowed to add or removed some
features unless check='full' is specified). Let's store the original CPU
in domain private data so that we can use it to provide a backward
compatible domain XML.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/libvirt_private.syms
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_process.c

index 003db6b6528436cddd2737cc152535add6beb9d9..b6c828fc22470a27fa51991eed626b88f79b334f 100644 (file)
@@ -77,9 +77,11 @@ virCPUDefCopyModelFilter;
 virCPUDefCopyWithoutModel;
 virCPUDefFormat;
 virCPUDefFormatBuf;
+virCPUDefFormatBufFull;
 virCPUDefFree;
 virCPUDefFreeFeatures;
 virCPUDefFreeModel;
+virCPUDefIsEqual;
 virCPUDefParseXML;
 virCPUDefStealModel;
 virCPUDefUpdateFeature;
index 80e9fea98f2d3466e6183959be802aae8fd10121..ba8079ba0c1c87cb4cadcede9392bd7919734c43 100644 (file)
@@ -1726,6 +1726,8 @@ qemuDomainObjPrivateFree(void *data)
     VIR_FREE(priv->migTLSAlias);
     qemuDomainMasterKeyFree(priv);
 
+    virCPUDefFree(priv->origCPU);
+
     VIR_FREE(priv);
 }
 
@@ -1881,6 +1883,8 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
     virBufferEscapeString(buf, "<channelTargetDir path='%s'/>\n",
                           priv->channelTargetDir);
 
+    virCPUDefFormatBufFull(buf, priv->origCPU, NULL, false);
+
     return 0;
 }
 
@@ -2149,6 +2153,9 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
     if (qemuDomainSetPrivatePathsOld(driver, vm) < 0)
         goto error;
 
+    if (virCPUDefParseXML(ctxt, "./cpu", VIR_CPU_TYPE_GUEST, &priv->origCPU) < 0)
+        goto error;
+
     return 0;
 
  error:
index cc2e21bdf56525866806f7af49b5f563bc884c74..f6dad437884b8d5d6735d0f963d1353249ba7695 100644 (file)
@@ -293,6 +293,10 @@ struct _qemuDomainObjPrivate {
     /* Used when fetching/storing the current 'tls-creds' migration setting */
     /* (not to be saved in our private XML). */
     char *migTLSAlias;
+
+    /* CPU def used to start the domain when it differs from the one actually
+     * provided by QEMU. */
+    virCPUDefPtr origCPU;
 };
 
 # define QEMU_DOMAIN_PRIVATE(vm)       \
index 32ba8e373d211cb18b9eb3ecdaade9c3b7cfeabe..c06349474710448d8580d8e67ba60f612993c0f7 100644 (file)
@@ -3915,6 +3915,7 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver,
     qemuDomainObjPrivatePtr priv = vm->privateData;
     int rc;
     int ret = -1;
+    virCPUDefPtr orig = NULL;
 
     if (ARCH_IS_X86(def->os.arch)) {
         if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
@@ -3945,10 +3946,17 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver,
         if (qemuProcessVerifyCPUFeatures(def, cpu) < 0)
             goto cleanup;
 
-        if ((rc = virCPUUpdateLive(def->os.arch, def->cpu, cpu, disabled)) < 0)
+        if (!(orig = virCPUDefCopy(def->cpu)))
             goto cleanup;
-        else if (rc == 0)
+
+        if ((rc = virCPUUpdateLive(def->os.arch, def->cpu, cpu, disabled)) < 0) {
+            goto cleanup;
+        } else if (rc == 0) {
+            if (!virCPUDefIsEqual(def->cpu, orig, false))
+                VIR_STEAL_PTR(priv->origCPU, orig);
+
             def->cpu->check = VIR_CPU_CHECK_FULL;
+        }
     }
 
     ret = 0;
@@ -3956,6 +3964,7 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver,
  cleanup:
     virCPUDataFree(cpu);
     virCPUDataFree(disabled);
+    virCPUDefFree(orig);
     return ret;
 }