]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Drop disabled CPU features unknown to QEMU
authorJiri Denemark <jdenemar@redhat.com>
Fri, 18 Oct 2019 12:33:19 +0000 (14:33 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 12 Nov 2019 19:14:16 +0000 (20:14 +0100)
When a CPU definition wants to explicitly disable some features that are
unknown to QEMU, we can safely drop them from the definition before
starting QEMU. Naturally QEMU won't enable such features implicitly.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_process.c
tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args

index 9b7dde66e78a6f313a85f4dbde8705d14a6681b8..4cf4069d50ac6e5097f7165803995e3635a4ce36 100644 (file)
@@ -6047,6 +6047,26 @@ qemuProcessSetupHotpluggableVcpus(virQEMUDriverPtr driver,
 }
 
 
+static bool
+qemuProcessDropUnknownCPUFeatures(const char *name,
+                                  virCPUFeaturePolicy policy,
+                                  void *opaque)
+{
+    const char **features = opaque;
+
+    if (policy != VIR_CPU_FEATURE_DISABLE &&
+        policy != VIR_CPU_FEATURE_FORBID)
+        return true;
+
+    if (virStringListHasString(features, name))
+        return true;
+
+    /* Features unknown to QEMU are implicitly disabled, we can just drop them
+     * from the definition. */
+    return false;
+}
+
+
 static int
 qemuProcessUpdateGuestCPU(virDomainDefPtr def,
                           virQEMUCapsPtr qemuCaps,
@@ -6112,6 +6132,18 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
                                 &def->os.arch) < 0)
         return -1;
 
+    if (ARCH_IS_X86(def->os.arch)) {
+        VIR_AUTOSTRINGLIST features = NULL;
+
+        if (virQEMUCapsGetCPUFeatures(qemuCaps, def->virtType, false, &features) < 0)
+            return -1;
+
+        if (features &&
+            virCPUDefFilterFeatures(def->cpu, qemuProcessDropUnknownCPUFeatures,
+                                    features) < 0)
+            return -1;
+    }
+
     return 0;
 }
 
index d6f5a0ad98eb243150689531cdc6421ebd5f0b99..88d05a482ad0081632c98bec0eb529f66e2d4eb3 100644 (file)
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
 -object secret,id=masterKey0,format=raw,\
 file=/tmp/lib/domain--1-test/master-key.aes \
 -machine pc,accel=kvm,usb=off,dump-guest-core=off \
--cpu Icelake-Server,pconfig=off \
+-cpu Icelake-Server \
 -m 214 \
 -overcommit mem-lock=off \
 -smp 1,sockets=1,cores=1,threads=1 \