c480ed
From 894b1e28647f0fd46da3ffc64afc358d438153f9 Mon Sep 17 00:00:00 2001
c480ed
Message-Id: <894b1e28647f0fd46da3ffc64afc358d438153f9@dist-git>
c480ed
From: Jiri Denemark <jdenemar@redhat.com>
c480ed
Date: Fri, 21 Jun 2019 09:26:04 +0200
c480ed
Subject: [PATCH] qemu_process: Prefer generic qemuMonitorGetGuestCPU
c480ed
MIME-Version: 1.0
c480ed
Content-Type: text/plain; charset=UTF-8
c480ed
Content-Transfer-Encoding: 8bit
c480ed
c480ed
When updating guest CPU definition according to the vCPU actually
c480ed
created by QEMU, we want to use the generic qemuMonitorGetGuestCPU to
c480ed
get both CPUID and MSR features.
c480ed
c480ed
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c480ed
Reviewed-by: Ján Tomko <jtomko@redhat.com>
c480ed
(cherry picked from commit 63acb7bfd56f117309e4fcaf438639d4d7bc7dcb)
c480ed
c480ed
https://bugzilla.redhat.com/show_bug.cgi?id=1697627
c480ed
c480ed
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c480ed
Message-Id: <711a363fde6df79fe9a26b6b4cb0a185cc5ad3cb.1561068591.git.jdenemar@redhat.com>
c480ed
Reviewed-by: Ján Tomko <jtomko@redhat.com>
c480ed
---
c480ed
 src/qemu/qemu_process.c | 24 ++++++++++++++++++++++--
c480ed
 1 file changed, 22 insertions(+), 2 deletions(-)
c480ed
c480ed
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
c480ed
index 59a739f262..d147e524ee 100644
c480ed
--- a/src/qemu/qemu_process.c
c480ed
+++ b/src/qemu/qemu_process.c
c480ed
@@ -4013,6 +4013,16 @@ qemuProcessVerifyCPUFeatures(virDomainDefPtr def,
c480ed
 }
c480ed
 
c480ed
 
c480ed
+static const char *
c480ed
+qemuProcessTranslateCPUFeatures(const char *name,
c480ed
+                                void *opaque)
c480ed
+{
c480ed
+    virQEMUCapsPtr qemuCaps = opaque;
c480ed
+
c480ed
+    return virQEMUCapsCPUFeatureFromQEMU(qemuCaps, name);
c480ed
+}
c480ed
+
c480ed
+
c480ed
 static int
c480ed
 qemuProcessFetchGuestCPU(virQEMUDriverPtr driver,
c480ed
                          virDomainObjPtr vm,
c480ed
@@ -4023,18 +4033,28 @@ qemuProcessFetchGuestCPU(virQEMUDriverPtr driver,
c480ed
     qemuDomainObjPrivatePtr priv = vm->privateData;
c480ed
     virCPUDataPtr dataEnabled = NULL;
c480ed
     virCPUDataPtr dataDisabled = NULL;
c480ed
+    bool generic;
c480ed
     int rc;
c480ed
 
c480ed
     *enabled = NULL;
c480ed
     *disabled = NULL;
c480ed
 
c480ed
-    if (!ARCH_IS_X86(vm->def->os.arch))
c480ed
+    generic = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CPU_UNAVAILABLE_FEATURES);
c480ed
+
c480ed
+    if (!generic && !ARCH_IS_X86(vm->def->os.arch))
c480ed
         return 0;
c480ed
 
c480ed
     if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
c480ed
         goto error;
c480ed
 
c480ed
-    rc = qemuMonitorGetGuestCPUx86(priv->mon, &dataEnabled, &dataDisabled);
c480ed
+    if (generic) {
c480ed
+        rc = qemuMonitorGetGuestCPU(priv->mon,
c480ed
+                                    vm->def->os.arch,
c480ed
+                                    qemuProcessTranslateCPUFeatures, priv->qemuCaps,
c480ed
+                                    &dataEnabled, &dataDisabled);
c480ed
+    } else {
c480ed
+        rc = qemuMonitorGetGuestCPUx86(priv->mon, &dataEnabled, &dataDisabled);
c480ed
+    }
c480ed
 
c480ed
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
c480ed
         goto error;
c480ed
-- 
c480ed
2.22.0
c480ed