Signed-off-by: Jiri Denemark <jdenemar@xxxxxxxxxx> --- src/qemu/qemu_capabilities.c | 55 ++++++++++++++++++++++++++++++++++---------- src/qemu/qemu_capabilities.h | 4 ++++ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 670f944..f70a36c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2302,6 +2302,32 @@ virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps) } +bool +virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, + virCapsPtr caps, + virDomainVirtType type, + virCPUMode mode) +{ + switch (mode) { + case VIR_CPU_MODE_HOST_PASSTHROUGH: + return type == VIR_DOMAIN_VIRT_KVM && + virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch); + + case VIR_CPU_MODE_HOST_MODEL: + return !!qemuCaps->cpuModel; + + case VIR_CPU_MODE_CUSTOM: + return qemuCaps->cpuDefinitions && + qemuCaps->cpuDefinitions->count > 0; + + case VIR_CPU_MODE_LAST: + break; + } + + return false; +} + + int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps, size_t *nmachines, virCapsGuestMachinePtr **machines) @@ -4260,22 +4286,27 @@ 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)) + if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype, + VIR_CPU_MODE_HOST_PASSTHROUGH)) domCaps->cpu.hostPassthrough = true; - domCaps->cpu.hostModel = virCPUDefCopy(qemuCaps->cpuModel); + if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype, + VIR_CPU_MODE_HOST_MODEL)) + domCaps->cpu.hostModel = virCPUDefCopy(qemuCaps->cpuModel); - if (qemuCaps->cpuDefinitions && - cpuGetModels(domCaps->arch, &models) >= 0) { - filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions, - models); - virStringFreeList(models); + if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype, + VIR_CPU_MODE_CUSTOM)) { + virDomainCapsCPUModelsPtr filtered = NULL; + char **models = NULL; + + if (qemuCaps->cpuDefinitions && + cpuGetModels(domCaps->arch, &models) >= 0) { + filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions, + models); + virStringFreeList(models); + } + domCaps->cpu.custom = filtered; } - domCaps->cpu.custom = filtered; return 0; } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 1203073..2ea5849 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -425,6 +425,10 @@ int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, char ***names, size_t *count); virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps); +bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, + virCapsPtr caps, + virDomainVirtType type, + virCPUMode mode); const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps, const char *name); int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps, -- 2.9.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list