]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Filter CPU features in active XML
authorJiri Denemark <jdenemar@redhat.com>
Thu, 6 Jun 2019 12:51:14 +0000 (14:51 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 19 Jun 2019 22:22:37 +0000 (00:22 +0200)
Properly filter features which should not be passed to QEMU because they
were never supported by QEMU or they did nothing and QEMU dropped them.

Currently they are just silently ignored by the command line generator.
Let's make this process more visible and clean by dropping the features
from the domain's active definition in qemuProcessUpdateGuestCPU.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_process.c

index 6cc165a11848df053e28c66892a14fdf8f793f27..a23e4283227048f601a7214283b1c98537d7d249 100644 (file)
@@ -7106,9 +7106,6 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
         virBufferAsprintf(buf, ",vendor=%s", cpu->vendor_id);
 
     for (i = 0; i < cpu->nfeatures; i++) {
-        if (!virQEMUCapsCPUFilterFeatures(cpu->features[i].name,
-                                          (virArch *)&def->os.arch))
-            continue;
         switch ((virCPUFeaturePolicy) cpu->features[i].policy) {
         case VIR_CPU_FEATURE_FORCE:
         case VIR_CPU_FEATURE_REQUIRE:
index 144328c148c14835afd163f6908cbf8e370db72d..47e84e5ef093c42cc5bf8b15438c64af875ba6f7 100644 (file)
@@ -5928,26 +5928,30 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
         return -1;
 
     /* nothing to update for host-passthrough */
-    if (def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH)
-        return 0;
+    if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) {
+        if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
+            virCPUCompare(caps->host.arch,
+                          virQEMUCapsGetHostModel(qemuCaps, def->virtType,
+                                                  VIR_QEMU_CAPS_HOST_CPU_FULL),
+                          def->cpu, true) < 0)
+            return -1;
 
-    if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
-        virCPUCompare(caps->host.arch,
-                      virQEMUCapsGetHostModel(qemuCaps, def->virtType,
-                                              VIR_QEMU_CAPS_HOST_CPU_FULL),
-                      def->cpu, true) < 0)
-        return -1;
+        if (virCPUUpdate(def->os.arch, def->cpu,
+                         virQEMUCapsGetHostModel(qemuCaps, def->virtType,
+                                                 VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0)
+            return -1;
 
-    if (virCPUUpdate(def->os.arch, def->cpu,
-                     virQEMUCapsGetHostModel(qemuCaps, def->virtType,
-                                             VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0)
-        return -1;
+        if (virCPUTranslate(def->os.arch, def->cpu,
+                            virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType)) < 0)
+            return -1;
+
+        def->cpu->fallback = VIR_CPU_FALLBACK_FORBID;
+    }
 
-    if (virCPUTranslate(def->os.arch, def->cpu,
-                        virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType)) < 0)
+    if (virCPUDefFilterFeatures(def->cpu, virQEMUCapsCPUFilterFeatures,
+                                &def->os.arch) < 0)
         return -1;
 
-    def->cpu->fallback = VIR_CPU_FALLBACK_FORBID;
     return 0;
 }