c313de
From 6227a5d2d70dd396c428af4864ab38b1a32ef0f5 Mon Sep 17 00:00:00 2001
c313de
Message-Id: <6227a5d2d70dd396c428af4864ab38b1a32ef0f5@dist-git>
c313de
From: Jiri Denemark <jdenemar@redhat.com>
c313de
Date: Fri, 15 Nov 2019 17:52:34 +0100
c313de
Subject: [PATCH] qemu: Drop disabled CPU features unknown to QEMU
c313de
MIME-Version: 1.0
c313de
Content-Type: text/plain; charset=UTF-8
c313de
Content-Transfer-Encoding: 8bit
c313de
c313de
When a CPU definition wants to explicitly disable some features that are
c313de
unknown to QEMU, we can safely drop them from the definition before
c313de
starting QEMU. Naturally QEMU won't enable such features implicitly.
c313de
c313de
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c313de
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
c313de
(cherry picked from commit ac34e141596fab70fbe91a396311f80db6cb57c5)
c313de
c313de
https://bugzilla.redhat.com/show_bug.cgi?id=1749672
c313de
https://bugzilla.redhat.com/show_bug.cgi?id=1756156
c313de
https://bugzilla.redhat.com/show_bug.cgi?id=1721608
c313de
c313de
Conflicts:
c313de
	src/qemu/qemu_process.c
c313de
            - downstream still uses cleanup label
c313de
c313de
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c313de
Message-Id: <92f146f8754300266d688dd92dfe95e737dda7da.1573836581.git.jdenemar@redhat.com>
c313de
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
c313de
---
c313de
 src/qemu/qemu_process.c                       | 32 +++++++++++++++++++
c313de
 ...-Icelake-Server-pconfig.x86_64-latest.args |  2 +-
c313de
 2 files changed, 33 insertions(+), 1 deletion(-)
c313de
c313de
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
c313de
index 0cd61f02bb..0700b054f3 100644
c313de
--- a/src/qemu/qemu_process.c
c313de
+++ b/src/qemu/qemu_process.c
c313de
@@ -5730,6 +5730,26 @@ qemuProcessSetupHotpluggableVcpus(virQEMUDriverPtr driver,
c313de
 }
c313de
 
c313de
 
c313de
+static bool
c313de
+qemuProcessDropUnknownCPUFeatures(const char *name,
c313de
+                                  virCPUFeaturePolicy policy,
c313de
+                                  void *opaque)
c313de
+{
c313de
+    const char **features = opaque;
c313de
+
c313de
+    if (policy != VIR_CPU_FEATURE_DISABLE &&
c313de
+        policy != VIR_CPU_FEATURE_FORBID)
c313de
+        return true;
c313de
+
c313de
+    if (virStringListHasString(features, name))
c313de
+        return true;
c313de
+
c313de
+    /* Features unknown to QEMU are implicitly disabled, we can just drop them
c313de
+     * from the definition. */
c313de
+    return false;
c313de
+}
c313de
+
c313de
+
c313de
 static int
c313de
 qemuProcessUpdateGuestCPU(virDomainDefPtr def,
c313de
                           virQEMUCapsPtr qemuCaps,
c313de
@@ -5792,6 +5812,18 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
c313de
                         virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType)) < 0)
c313de
         goto cleanup;
c313de
 
c313de
+    if (ARCH_IS_X86(def->os.arch)) {
c313de
+        VIR_AUTOSTRINGLIST features = NULL;
c313de
+
c313de
+        if (virQEMUCapsGetCPUFeatures(qemuCaps, def->virtType, false, &features) < 0)
c313de
+            goto cleanup;
c313de
+
c313de
+        if (features &&
c313de
+            virCPUDefFilterFeatures(def->cpu, qemuProcessDropUnknownCPUFeatures,
c313de
+                                    features) < 0)
c313de
+            goto cleanup;
c313de
+    }
c313de
+
c313de
     def->cpu->fallback = VIR_CPU_FALLBACK_FORBID;
c313de
     ret = 0;
c313de
 
c313de
diff --git a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
c313de
index 664db44e7b..de737bfed7 100644
c313de
--- a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
c313de
+++ b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
c313de
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
c313de
 -object secret,id=masterKey0,format=raw,\
c313de
 file=/tmp/lib/domain--1-test/master-key.aes \
c313de
 -machine pc,accel=kvm,usb=off,dump-guest-core=off \
c313de
--cpu Icelake-Server,pconfig=off \
c313de
+-cpu Icelake-Server \
c313de
 -m 214 \
c313de
 -realtime mlock=off \
c313de
 -smp 1,sockets=1,cores=1,threads=1 \
c313de
-- 
c313de
2.24.0
c313de