[libvirt] [PATCH v2 05/33] qemu: Refactor virQEMUCapsInitHostCPUModel
John Ferlan
jferlan at redhat.com
Tue Feb 21 14:24:13 UTC 2017
On 02/15/2017 11:44 AM, Jiri Denemark wrote:
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
>
> Notes:
> Version 2:
> - no change
>
> src/qemu/qemu_capabilities.c | 109 ++++++++++++++++++++++---------------------
> 1 file changed, 55 insertions(+), 54 deletions(-)
>
This is "visually" more than a refactor since you've specified an
initialization of cpu->fallback... That initialization gets essentially
the same value of 0 (ALLOW == 0) as would any VIR_ALLOC field, so it's
not a problem per se. Still makes me wonder if there should have been
an "UNDEFINED" category...
My only other comment here is whether there is a concern that your error
path doesn't clear the qemuCaps->hostCPUModel. It wasn't clear to me
whether this path can be called after libvirtd restart and if failure
would mean anything or not (perhaps the one reason I could think of
setting NULL previously).
ACK in principal - might be nice to mention why clearing hostCPUModel on
failure isn't required anymore.
John
> 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)
>
More information about the libvir-list
mailing list