
On 08/12/2016 09:33 AM, Jiri Denemark wrote:
Listing all CPU models supported by QEMU in domain capabilities makes little sense when libvirt will refuse any model it doesn't know about.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/conf/domain_capabilities.c | 27 ++ src/conf/domain_capabilities.h | 2 + src/libvirt_private.syms | 1 + src/qemu/qemu_capabilities.c | 10 +- tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml | 428 ---------------------- 5 files changed, 39 insertions(+), 429 deletions(-)
diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index c07f995..6f9f7e7 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -169,6 +169,33 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) }
+virDomainCapsCPUModelsPtr +virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, + char **models) +{ + virDomainCapsCPUModelsPtr cpuModels; + size_t i; + + if (!(cpuModels = virDomainCapsCPUModelsNew(0))) + return NULL; + + for (i = 0; i < old->count; i++) { + if (models && !virStringArrayHasString(models, old->models[i].name))
My Coverity environment had a build failure here: conf/domain_capabilities.c: In function 'virDomainCapsCPUModelsFilter': conf/domain_capabilities.c:183:48: error: passing argument 1 of 'virStringArrayHasString' from incompatible pointer type [-Werror=incompatible-pointer-types] if (models && !virStringArrayHasString(models, old->models[i].name)) ^~~~~~ In file included from conf/domain_capabilities.c:28:0: ./util/virstring.h:47:6: note: expected 'const char **' but argument is of type 'char **' bool virStringArrayHasString(const char **strings, const char *needle); ^~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors Makefile:8092: recipe for target 'conf/libvirt_conf_la-domain_capabilities.lo' failed Which a handily place (const char **) resolved. I seem to recall a discussion on something similar recently upstream...
+ continue; + + if (virDomainCapsCPUModelsAdd(cpuModels, + old->models[i].name, -1) < 0) + goto error; + } + + return cpuModels; + + error: + virObjectUnref(cpuModels); + return NULL; +} + + int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, char **name) diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 509c306..29b18bb 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -156,6 +156,8 @@ virDomainCapsPtr virDomainCapsNew(const char *path,
virDomainCapsCPUModelsPtr virDomainCapsCPUModelsNew(size_t nmodels); virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old); +virDomainCapsCPUModelsPtr virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, + char **models); int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, char **name); int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f91ce17..80c112a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -155,6 +155,7 @@ virDomainAuditVcpu; virDomainCapsCPUModelsAdd; virDomainCapsCPUModelsAddSteal; virDomainCapsCPUModelsCopy; +virDomainCapsCPUModelsFilter; virDomainCapsCPUModelsNew; virDomainCapsEnumClear; virDomainCapsEnumSet; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 7a7ddb8..123aae5 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4198,6 +4198,8 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps, virQEMUCapsPtr qemuCaps, virDomainCapsPtr domCaps) { + virDomainCapsCPUModelsPtr filtered = NULL; + char **models = NULL;
if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM && virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch)) @@ -4207,7 +4209,13 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps, domCaps->cpu.hostModel = virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch);
- domCaps->cpu.custom = virObjectRef(qemuCaps->cpuDefinitions); + if (qemuCaps->cpuDefinitions && + cpuGetModels(domCaps->arch, &models) >= 0) {
if cpuGetModels returns 0, then models is empty so is there any point in making the call?
+ filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions, + models); + virStringFreeList(models); + } + domCaps->cpu.custom = filtered;
return 0; }
[...]