a3bc25
From e5840b68e6376a514c6c5de1897ac87dc57e7a58 Mon Sep 17 00:00:00 2001
a3bc25
Message-Id: <e5840b68e6376a514c6c5de1897ac87dc57e7a58@dist-git>
a3bc25
From: Jiri Denemark <jdenemar@redhat.com>
a3bc25
Date: Tue, 11 Jul 2017 13:51:17 +0200
a3bc25
Subject: [PATCH] qemu: Add qemuProcessUpdateLiveGuestCPU
a3bc25
a3bc25
Separated from qemuProcessUpdateAndVerifyCPU to handle updating of an
a3bc25
active guest CPU definition according to live data from QEMU.
a3bc25
a3bc25
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
a3bc25
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
a3bc25
(cherry picked from commit eef9f83b691e0713e4fc480b497b85517aba6ca4)
a3bc25
a3bc25
https://bugzilla.redhat.com/show_bug.cgi?id=1470582
a3bc25
a3bc25
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
a3bc25
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
a3bc25
---
a3bc25
 src/qemu/qemu_process.c | 72 ++++++++++++++++++++++++++++++-------------------
a3bc25
 1 file changed, 44 insertions(+), 28 deletions(-)
a3bc25
a3bc25
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
a3bc25
index 1e7724e784..9df463094e 100644
a3bc25
--- a/src/qemu/qemu_process.c
a3bc25
+++ b/src/qemu/qemu_process.c
a3bc25
@@ -3971,17 +3971,55 @@ qemuProcessVerifyCPU(virDomainObjPtr vm,
a3bc25
 
a3bc25
 
a3bc25
 static int
a3bc25
+qemuProcessUpdateLiveGuestCPU(virDomainObjPtr vm,
a3bc25
+                              virCPUDataPtr enabled,
a3bc25
+                              virCPUDataPtr disabled)
a3bc25
+{
a3bc25
+    virDomainDefPtr def = vm->def;
a3bc25
+    qemuDomainObjPrivatePtr priv = vm->privateData;
a3bc25
+    virCPUDefPtr orig = NULL;
a3bc25
+    int rc;
a3bc25
+    int ret = -1;
a3bc25
+
a3bc25
+    if (!enabled)
a3bc25
+        return 0;
a3bc25
+
a3bc25
+    if (!def->cpu ||
a3bc25
+        (def->cpu->mode == VIR_CPU_MODE_CUSTOM &&
a3bc25
+         !def->cpu->model))
a3bc25
+        return 0;
a3bc25
+
a3bc25
+    if (!(orig = virCPUDefCopy(def->cpu)))
a3bc25
+        goto cleanup;
a3bc25
+
a3bc25
+    if ((rc = virCPUUpdateLive(def->os.arch, def->cpu, enabled, disabled)) < 0) {
a3bc25
+        goto cleanup;
a3bc25
+    } else if (rc == 0) {
a3bc25
+        /* Store the original CPU in priv if QEMU changed it and we didn't
a3bc25
+         * get the original CPU via migration, restore, or snapshot revert.
a3bc25
+         */
a3bc25
+        if (!priv->origCPU && !virCPUDefIsEqual(def->cpu, orig, false))
a3bc25
+            VIR_STEAL_PTR(priv->origCPU, orig);
a3bc25
+
a3bc25
+        def->cpu->check = VIR_CPU_CHECK_FULL;
a3bc25
+    }
a3bc25
+
a3bc25
+    ret = 0;
a3bc25
+
a3bc25
+ cleanup:
a3bc25
+    virCPUDefFree(orig);
a3bc25
+    return ret;
a3bc25
+}
a3bc25
+
a3bc25
+
a3bc25
+static int
a3bc25
 qemuProcessUpdateAndVerifyCPU(virQEMUDriverPtr driver,
a3bc25
                               virDomainObjPtr vm,
a3bc25
                               qemuDomainAsyncJob asyncJob)
a3bc25
 {
a3bc25
-    virDomainDefPtr def = vm->def;
a3bc25
     virCPUDataPtr cpu = NULL;
a3bc25
     virCPUDataPtr disabled = NULL;
a3bc25
-    qemuDomainObjPrivatePtr priv = vm->privateData;
a3bc25
-    int rc;
a3bc25
     int ret = -1;
a3bc25
-    virCPUDefPtr orig = NULL;
a3bc25
 
a3bc25
     if (qemuProcessFetchGuestCPU(driver, vm, asyncJob, &cpu, &disabled) < 0)
a3bc25
         goto cleanup;
a3bc25
@@ -3989,36 +4027,14 @@ qemuProcessUpdateAndVerifyCPU(virQEMUDriverPtr driver,
a3bc25
     if (qemuProcessVerifyCPU(vm, cpu) < 0)
a3bc25
         goto cleanup;
a3bc25
 
a3bc25
-    if (cpu) {
a3bc25
-        if (!def->cpu ||
a3bc25
-            (def->cpu->mode == VIR_CPU_MODE_CUSTOM &&
a3bc25
-             !def->cpu->model)) {
a3bc25
-            ret = 0;
a3bc25
-            goto cleanup;
a3bc25
-        }
a3bc25
-
a3bc25
-        if (!(orig = virCPUDefCopy(def->cpu)))
a3bc25
-            goto cleanup;
a3bc25
-
a3bc25
-        if ((rc = virCPUUpdateLive(def->os.arch, def->cpu, cpu, disabled)) < 0) {
a3bc25
-            goto cleanup;
a3bc25
-        } else if (rc == 0) {
a3bc25
-            /* Store the original CPU in priv if QEMU changed it and we didn't
a3bc25
-             * get the original CPU via migration, restore, or snapshot revert.
a3bc25
-             */
a3bc25
-            if (!priv->origCPU && !virCPUDefIsEqual(def->cpu, orig, false))
a3bc25
-                VIR_STEAL_PTR(priv->origCPU, orig);
a3bc25
-
a3bc25
-            def->cpu->check = VIR_CPU_CHECK_FULL;
a3bc25
-        }
a3bc25
-    }
a3bc25
+    if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0)
a3bc25
+        goto cleanup;
a3bc25
 
a3bc25
     ret = 0;
a3bc25
 
a3bc25
  cleanup:
a3bc25
     virCPUDataFree(cpu);
a3bc25
     virCPUDataFree(disabled);
a3bc25
-    virCPUDefFree(orig);
a3bc25
     return ret;
a3bc25
 }
a3bc25
 
a3bc25
-- 
a3bc25
2.13.2
a3bc25