qemu: Do not set default CPU for archs without CPU driver

Whenever there is a guest CPU configured in domain XML, we will call
some CPU driver APIs to validate the CPU definition and check its
compatibility with the hypervisor. Thus domains with guest CPU
specification can only be started if the guest architecture is supported
by the CPU driver. But we would add a default CPU to any domain as long
as QEMU reports it causing failures to start any domain on affected
architectures.

https://bugzilla.redhat.com/show_bug.cgi?id=1805755

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Jiri Denemark 2020-02-25 16:05:06 +01:00
parent d552b93448
commit 768ecdcd4b
4 changed files with 31 additions and 0 deletions

View File

@ -1096,3 +1096,27 @@ virCPUDataAddFeature(virCPUDataPtr cpuData,
return driver->dataAddFeature(cpuData, name);
}
/**
* virCPUArchIsSupported:
*
* @arch: CPU architecture
*
* Returns true if the architecture is supported by any CPU driver.
*/
bool
virCPUArchIsSupported(virArch arch)
{
size_t i;
size_t j;
for (i = 0; i < G_N_ELEMENTS(drivers); i++) {
for (j = 0; j < drivers[i]->narch; j++) {
if (arch == drivers[i]->arch[j])
return true;
}
}
return false;
}

View File

@ -265,6 +265,9 @@ int
virCPUDataAddFeature(virCPUDataPtr cpuData,
const char *name);
bool
virCPUArchIsSupported(virArch arch);
/* virCPUDataFormat and virCPUDataParse are implemented for unit tests only and
* have no real-life usage
*/

View File

@ -1310,6 +1310,7 @@ virStoragePoolObjVolumeListExport;
# cpu/cpu.h
cpuDecode;
cpuEncode;
virCPUArchIsSupported;
virCPUBaseline;
virCPUCheckFeature;
virCPUCompare;

View File

@ -4576,6 +4576,9 @@ qemuDomainDefSetDefaultCPU(virDomainDefPtr def,
def->cpu->model))
return 0;
if (!virCPUArchIsSupported(def->os.arch))
return 0;
/* Default CPU model info from QEMU is usable for TCG only except for
* x86, s390, and ppc64. */
if (!ARCH_IS_X86(def->os.arch) &&