]> xenbits.xensource.com Git - 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 20:27:37 +0000 (21:27 +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.

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

index 5d101a40eae9abc6aeb29e880c3bf8d719b9831e..56080ef1f4007eac5c2c55e8efb50d675e4f2af6 100644 (file)
@@ -1851,6 +1851,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 = virCPUx86GetMap()))
         goto error;
@@ -1873,9 +1875,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;
 
@@ -1923,9 +1935,12 @@ x86Baseline(virCPUDefPtr *cpus,
     if (vendor && virCPUx86DataAddCPUID(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'/>