From 580ddf0d34ad61b26357b94783ff622d0e73cb2b Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Mon, 27 Jan 2014 20:41:43 +0100 Subject: [PATCH] cpu: Try to use source CPU model in virConnectBaselineCPU 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 | 17 ++++++++++++++++- tests/cputestdata/x86-baseline-3-expanded.xml | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 5d101a40ea..56080ef1f4 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -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); diff --git a/tests/cputestdata/x86-baseline-3-expanded.xml b/tests/cputestdata/x86-baseline-3-expanded.xml index d196112b27..a7e57be76d 100644 --- a/tests/cputestdata/x86-baseline-3-expanded.xml +++ b/tests/cputestdata/x86-baseline-3-expanded.xml @@ -1,5 +1,5 @@ - Westmere + Westmere -- GitLab