Signed-off-by: Jiri Denemark <jdenemar@xxxxxxxxxx> --- Notes: Version 2: - no change src/qemu/qemu_capabilities.c | 109 ++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 399e31447..c5e57b4ab 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3041,37 +3041,36 @@ virQEMUCapsCPUFilterFeatures(const char *name, } -static void -virQEMUCapsCopyCPUModelFromQEMU(virQEMUCapsPtr qemuCaps) +/** + * Returns 0 when host CPU model provided by QEMU was filled in qemuCaps, + * 1 when the caller should fall back to using virCapsPtr->host.cpu, + * -1 on error. + */ +static int +virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps, + virCPUDefPtr cpu) { - virCPUDefPtr cpu = NULL; - qemuMonitorCPUModelInfoPtr modelInfo = NULL; + qemuMonitorCPUModelInfoPtr modelInfo = qemuCaps->hostCPUModelInfo; size_t i; - if (!(modelInfo = qemuCaps->hostCPUModelInfo)) { + if (!modelInfo) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("missing host CPU model info from QEMU capabilities" - " for binary %s"), qemuCaps->binary); - goto error; + _("missing host CPU model info from QEMU capabilities " + "for binary %s"), + qemuCaps->binary); + return -1; } - if (VIR_ALLOC(cpu) < 0) - goto error; - if (VIR_STRDUP(cpu->model, modelInfo->name) < 0 || VIR_ALLOC_N(cpu->features, modelInfo->nprops) < 0) - goto error; + return -1; cpu->nfeatures_max = modelInfo->nprops; cpu->nfeatures = 0; - cpu->sockets = cpu->cores = cpu->threads = 0; - cpu->type = VIR_CPU_TYPE_GUEST; - cpu->mode = VIR_CPU_MODE_CUSTOM; - cpu->match = VIR_CPU_MATCH_EXACT; for (i = 0; i < modelInfo->nprops; i++) { if (VIR_STRDUP(cpu->features[i].name, modelInfo->props[i].name) < 0) - goto error; + return -1; if (modelInfo->props[i].supported) cpu->features[i].policy = VIR_CPU_FEATURE_REQUIRE; @@ -3081,31 +3080,53 @@ virQEMUCapsCopyCPUModelFromQEMU(virQEMUCapsPtr qemuCaps) cpu->nfeatures++; } - qemuCaps->hostCPUModel = cpu; - return; - - error: - virCPUDefFree(cpu); - qemuCaps->hostCPUModel = NULL; - virResetLastError(); + return 0; } -static void -virQEMUCapsCopyCPUModelFromHost(virQEMUCapsPtr qemuCaps, - virCapsPtr caps) +/** + * Returns 0 when host CPU model provided by QEMU was filled in qemuCaps, + * 1 when the caller should fall back to using virCapsPtr->host.cpu, + * -1 on error. + */ +static int +virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps, + virCPUDefPtr cpu) +{ + int ret = 1; + + if (ARCH_IS_S390(qemuCaps->arch)) + ret = virQEMUCapsInitCPUModelS390(qemuCaps, cpu); + + return ret; +} + + +void +virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, + virCapsPtr caps) { virCPUDefPtr cpu = NULL; + int rc; - if (caps->host.cpu && caps->host.cpu->model) { - if (VIR_ALLOC(cpu) < 0) + if (!caps || !virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch)) + return; + + if (VIR_ALLOC(cpu) < 0) + goto error; + + cpu->type = VIR_CPU_TYPE_GUEST; + cpu->mode = VIR_CPU_MODE_CUSTOM; + cpu->match = VIR_CPU_MATCH_EXACT; + cpu->fallback = VIR_CPU_FALLBACK_ALLOW; + + if ((rc = virQEMUCapsInitCPUModel(qemuCaps, cpu)) < 0) { + goto error; + } else if (rc == 1) { + VIR_DEBUG("No host CPU model info from QEMU; using host capabilities"); + if (!caps->host.cpu || !caps->host.cpu->model) goto error; - cpu->sockets = cpu->cores = cpu->threads = 0; - cpu->type = VIR_CPU_TYPE_GUEST; - cpu->mode = VIR_CPU_MODE_CUSTOM; - cpu->match = VIR_CPU_MATCH_EXACT; - if (virCPUDefCopyModelFilter(cpu, caps->host.cpu, true, virQEMUCapsCPUFilterFeatures, NULL) < 0) goto error; @@ -3116,30 +3137,10 @@ virQEMUCapsCopyCPUModelFromHost(virQEMUCapsPtr qemuCaps, error: virCPUDefFree(cpu); - qemuCaps->hostCPUModel = NULL; virResetLastError(); } -void -virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, - virCapsPtr caps) -{ - if (!caps || !virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch)) - return; - - switch (qemuCaps->arch) { - case VIR_ARCH_S390: - case VIR_ARCH_S390X: - virQEMUCapsCopyCPUModelFromQEMU(qemuCaps); - break; - - default: - virQEMUCapsCopyCPUModelFromHost(qemuCaps, caps); - } -} - - static int virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, xmlXPathContextPtr ctxt) -- 2.11.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list