]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
cpu: Try to use source CPU model in virConnectBaselineCPU
authorJiri Denemark <jdenemar@redhat.com>
Mon, 27 Jan 2014 19:41:43 +0000 (20:41 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 28 Jan 2014 21:14:22 +0000 (22:14 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=1049391

When all source CPU XMLs contain just a single CPU model (with a
possibly varying set of additional feature elements),
virConnectBaselineCPU will try to use this CPU model in the computed
guest CPU. Thus, when used on just a single CPU (useful with
VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES), the result will not use a
different CPU model.

If the computed CPU uses the source model, set fallback mode to 'forbid'
to make sure the guest CPU will always be as close as possible to the
source CPUs.

(cherry picked from commit 580ddf0d34ad61b26357b94783ff622d0e73cb2b)

src/cpu/cpu_x86.c
tests/cputestdata/x86-baseline-3-expanded.xml

index 18e39becb70ebf1b333ea4291c405b33e0af1ca4..0b82bf2db061d370caf238d4a867d8fd3fcbefa5 100644 (file)
@@ -1735,6 +1735,8 @@ x86Baseline(virCPUDefPtr *cpus,
     const struct x86_vendor *vendor = NULL;
     struct x86_model *model = NULL;
     bool outputVendor = true;
+    const char *modelName;
+    bool matchingNames = true;
 
     if (!(map = x86LoadMap()))
         goto error;
@@ -1757,9 +1759,19 @@ x86Baseline(virCPUDefPtr *cpus,
         goto error;
     }
 
+    modelName = cpus[0]->model;
     for (i = 1; i < ncpus; i++) {
         const char *vn = NULL;
 
+        if (matchingNames && cpus[i]->model) {
+            if (!modelName) {
+                modelName = cpus[i]->model;
+            } else if (STRNEQ(modelName, cpus[i]->model)) {
+                modelName = NULL;
+                matchingNames = false;
+            }
+        }
+
         if (!(model = x86ModelFromCPU(cpus[i], map, VIR_CPU_FEATURE_REQUIRE)))
             goto error;
 
@@ -1807,9 +1819,12 @@ x86Baseline(virCPUDefPtr *cpus,
     if (vendor && x86DataAddCpuid(base_model->data, &vendor->cpuid) < 0)
         goto error;
 
-    if (x86Decode(cpu, base_model->data, models, nmodels, NULL, flags) < 0)
+    if (x86Decode(cpu, base_model->data, models, nmodels, modelName, flags) < 0)
         goto error;
 
+    if (STREQ_NULLABLE(cpu->model, modelName))
+        cpu->fallback = VIR_CPU_FALLBACK_FORBID;
+
     if (!outputVendor)
         VIR_FREE(cpu->vendor);
 
index d196112b2723ccb0e6ad5b9ed444e6edc586a532..a7e57be76d6e6b3ec5e4e95aba4619c218612fb7 100644 (file)
@@ -1,5 +1,5 @@
 <cpu mode='custom' match='exact'>
-  <model fallback='allow'>Westmere</model>
+  <model fallback='forbid'>Westmere</model>
   <feature policy='require' name='lahf_lm'/>
   <feature policy='require' name='lm'/>
   <feature policy='require' name='nx'/>