diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 18927cba97..985b585d4d 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2371,6 +2371,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->hostCPUModel; + + case VIR_CPU_MODE_CUSTOM: + return qemuCaps->cpuDefinitions && + qemuCaps->cpuDefinitions->nmodels > 0; + + case VIR_CPU_MODE_LAST: + break; + } + + return false; +} + + int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps, size_t *nmachines, virCapsGuestMachinePtr **machines) @@ -4358,22 +4384,26 @@ 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->hostCPUModel); + if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype, + VIR_CPU_MODE_HOST_MODEL)) + domCaps->cpu.hostModel = virCPUDefCopy(qemuCaps->hostCPUModel); - if (qemuCaps->cpuDefinitions && - cpuGetModels(domCaps->arch, &models) >= 0) { - filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions, - (const char **) models); - virStringFreeList(models); + if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype, + VIR_CPU_MODE_CUSTOM)) { + virDomainCapsCPUModelsPtr filtered = NULL; + char **models = NULL; + + if (cpuGetModels(domCaps->arch, &models) >= 0) { + filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions, + (const char **) 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 b1d512efde..ba0ef4859d 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -430,6 +430,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,