qemu: Prepare qemuCaps for multiple host CPU defs

Soon we will need to store multiple host CPU definitions in
virQEMUCapsHostCPUData and qemuCaps users will want to request the one
they need. This patch introduces virQEMUCapsHostCPUType enum which will
be used for specifying the requested CPU definition.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
Jiri Denemark 2017-04-11 11:14:30 +02:00
parent b0a84ffb7f
commit 1fe517c68d
4 changed files with 27 additions and 8 deletions

View File

@ -2475,11 +2475,17 @@ virQEMUCapsGetHostCPUData(virQEMUCapsPtr qemuCaps,
virCPUDefPtr virCPUDefPtr
virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps, virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
virDomainVirtType type) virDomainVirtType type,
virQEMUCapsHostCPUType cpuType)
{ {
virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type); virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
return cpuData->reported; switch (cpuType) {
case VIR_QEMU_CAPS_HOST_CPU_REPORTED:
return cpuData->reported;
}
return NULL;
} }
@ -2508,7 +2514,8 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch); virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch);
case VIR_CPU_MODE_HOST_MODEL: case VIR_CPU_MODE_HOST_MODEL:
return !!virQEMUCapsGetHostModel(qemuCaps, type); return !!virQEMUCapsGetHostModel(qemuCaps, type,
VIR_QEMU_CAPS_HOST_CPU_REPORTED);
case VIR_CPU_MODE_CUSTOM: case VIR_CPU_MODE_CUSTOM:
if (type == VIR_DOMAIN_VIRT_KVM) if (type == VIR_DOMAIN_VIRT_KVM)
@ -5521,7 +5528,8 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype, if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
VIR_CPU_MODE_HOST_MODEL)) { VIR_CPU_MODE_HOST_MODEL)) {
virCPUDefPtr cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype); virCPUDefPtr cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
VIR_QEMU_CAPS_HOST_CPU_REPORTED);
domCaps->cpu.hostModel = virCPUDefCopy(cpu); domCaps->cpu.hostModel = virCPUDefCopy(cpu);
} }

View File

@ -449,8 +449,16 @@ int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
virDomainVirtType type, virDomainVirtType type,
char ***names, char ***names,
size_t *count); size_t *count);
typedef enum {
/* Host CPU definition reported in domain capabilities. */
VIR_QEMU_CAPS_HOST_CPU_REPORTED,
} virQEMUCapsHostCPUType;
virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps, virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
virDomainVirtType type); virDomainVirtType type,
virQEMUCapsHostCPUType cpuType);
bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virCapsPtr caps, virCapsPtr caps,
virDomainVirtType type, virDomainVirtType type,

View File

@ -6899,7 +6899,8 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
if (def->cpu->mode == VIR_CPU_MODE_CUSTOM) if (def->cpu->mode == VIR_CPU_MODE_CUSTOM)
cpuDef = def->cpu; cpuDef = def->cpu;
else if (def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) else if (def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH)
cpuDef = virQEMUCapsGetHostModel(qemuCaps, def->virtType); cpuDef = virQEMUCapsGetHostModel(qemuCaps, def->virtType,
VIR_QEMU_CAPS_HOST_CPU_REPORTED);
if (cpuDef) { if (cpuDef) {
int svm = virCPUCheckFeature(def->os.arch, cpuDef, "svm"); int svm = virCPUCheckFeature(def->os.arch, cpuDef, "svm");

View File

@ -5304,12 +5304,14 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
if (def->cpu->check == VIR_CPU_CHECK_PARTIAL && if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
virCPUCompare(caps->host.arch, virCPUCompare(caps->host.arch,
virQEMUCapsGetHostModel(qemuCaps, def->virtType), virQEMUCapsGetHostModel(qemuCaps, def->virtType,
VIR_QEMU_CAPS_HOST_CPU_REPORTED),
def->cpu, true) < 0) def->cpu, true) < 0)
return -1; return -1;
if (virCPUUpdate(def->os.arch, def->cpu, if (virCPUUpdate(def->os.arch, def->cpu,
virQEMUCapsGetHostModel(qemuCaps, def->virtType)) < 0) virQEMUCapsGetHostModel(qemuCaps, def->virtType,
VIR_QEMU_CAPS_HOST_CPU_REPORTED)) < 0)
goto cleanup; goto cleanup;
if (virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType, if (virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType,