[PATCH] cpuCompare: Fix comparison of two host CPUs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When a CPU to be compared with host CPU describes a host CPU instead of
a guest CPU, the result is incorrect. This is because instead of
treating additional features in host CPU description as required, they
were treated as if they were mentioned with all possible policies at the
same time.
---
 src/cpu/cpu_x86.c |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 114235c..ab7c8cc 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -826,8 +826,7 @@ x86ModelFromCPU(const virCPUDefPtr cpu,
     struct x86_model *model = NULL;
     int i;
 
-    if (cpu->type == VIR_CPU_TYPE_HOST
-        || policy == VIR_CPU_FEATURE_REQUIRE) {
+    if (policy == VIR_CPU_FEATURE_REQUIRE) {
         if ((model = x86ModelFind(map, cpu->model)) == NULL) {
             virCPUReportError(VIR_ERR_INTERNAL_ERROR,
                     _("Unknown CPU model %s"), cpu->model);
@@ -839,6 +838,8 @@ x86ModelFromCPU(const virCPUDefPtr cpu,
     }
     else if (VIR_ALLOC(model) < 0)
         goto no_memory;
+    else if (cpu->type == VIR_CPU_TYPE_HOST)
+        return model;
 
     for (i = 0; i < cpu->nfeatures; i++) {
         const struct x86_feature *feature;
@@ -1181,7 +1182,7 @@ x86Compute(virCPUDefPtr host,
     }
 
     if (!(map = x86LoadMap()) ||
-        !(host_model = x86ModelFromCPU(host, map, 0)) ||
+        !(host_model = x86ModelFromCPU(host, map, VIR_CPU_FEATURE_REQUIRE)) ||
         !(cpu_force = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_FORCE)) ||
         !(cpu_require = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_REQUIRE)) ||
         !(cpu_optional = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_OPTIONAL)) ||
@@ -1611,7 +1612,7 @@ x86Baseline(virCPUDefPtr *cpus,
     if (!(map = x86LoadMap()))
         goto error;
 
-    if (!(base_model = x86ModelFromCPU(cpus[0], map, 0)))
+    if (!(base_model = x86ModelFromCPU(cpus[0], map, VIR_CPU_FEATURE_REQUIRE)))
         goto error;
 
     if (VIR_ALLOC(cpu) < 0 ||
@@ -1630,7 +1631,7 @@ x86Baseline(virCPUDefPtr *cpus,
     for (i = 1; i < ncpus; i++) {
         const char *vn = NULL;
 
-        if (!(model = x86ModelFromCPU(cpus[i], map, 0)))
+        if (!(model = x86ModelFromCPU(cpus[i], map, VIR_CPU_FEATURE_REQUIRE)))
             goto error;
 
         if (cpus[i]->vendor && model->vendor &&
@@ -1710,7 +1711,7 @@ x86Update(virCPUDefPtr guest,
     union cpuData *data = NULL;
 
     if (!(map = x86LoadMap()) ||
-        !(host_model = x86ModelFromCPU(host, map, 0)))
+        !(host_model = x86ModelFromCPU(host, map, VIR_CPU_FEATURE_REQUIRE)))
         goto cleanup;
 
     for (i = 0; i < guest->nfeatures; i++) {
-- 
1.7.1.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]