[libvirt] [PATCH] cpuBaseline: Detect empty set of common features

In case the set of CPUs has no features in common, report incompatible CPUs instead of returning the simplest CPU model with all features disabled. --- src/cpu/cpu_x86.c | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 30a2db6..0266ce9 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -233,6 +233,26 @@ x86DataSubtract(union cpuData *data1, } +static bool +x86DataIsEmpty(union cpuData *data) +{ + struct cpuX86cpuid zero = { 0, 0, 0, 0, 0 }; + unsigned int i; + + for (i = 0; i < data->x86.basic_len; i++) { + if (!x86cpuidMatch(data->x86.basic + i, &zero)) + return false; + } + + for (i = 0; i < data->x86.extended_len; i++) { + if (!x86cpuidMatch(data->x86.extended + i, &zero)) + return false; + } + + return true; +} + + static union cpuData * x86DataFromModel(const struct x86_model *model) { @@ -1363,6 +1383,12 @@ x86Baseline(virCPUDefPtr *cpus, if (!(data = x86DataFromModel(base_model))) goto no_memory; + if (x86DataIsEmpty(data)) { + virCPUReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("CPUs are incompatible")); + goto error; + } + if (x86Decode(cpu, data, models, nmodels, NULL) < 0) goto error; -- 1.7.1.1

On Fri, Jul 02, 2010 at 11:16:16PM +0200, Jiri Denemark wrote:
In case the set of CPUs has no features in common, report incompatible CPUs instead of returning the simplest CPU model with all features disabled. --- src/cpu/cpu_x86.c | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 30a2db6..0266ce9 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -233,6 +233,26 @@ x86DataSubtract(union cpuData *data1, }
+static bool +x86DataIsEmpty(union cpuData *data) +{ + struct cpuX86cpuid zero = { 0, 0, 0, 0, 0 }; + unsigned int i; + + for (i = 0; i < data->x86.basic_len; i++) { + if (!x86cpuidMatch(data->x86.basic + i, &zero)) + return false; + } + + for (i = 0; i < data->x86.extended_len; i++) { + if (!x86cpuidMatch(data->x86.extended + i, &zero)) + return false; + } + + return true; +} + + static union cpuData * x86DataFromModel(const struct x86_model *model) { @@ -1363,6 +1383,12 @@ x86Baseline(virCPUDefPtr *cpus, if (!(data = x86DataFromModel(base_model))) goto no_memory;
+ if (x86DataIsEmpty(data)) { + virCPUReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("CPUs are incompatible")); + goto error; + } + if (x86Decode(cpu, data, models, nmodels, NULL) < 0) goto error;
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

In case the set of CPUs has no features in common, report incompatible CPUs instead of returning the simplest CPU model with all features disabled. --- src/cpu/cpu_x86.c | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-)
ACK
Thanks, pushed. Jirka
participants (2)
-
Daniel P. Berrange
-
Jiri Denemark