[libvirt] [RFC 6/6] qemu: Cache GIC capabilities

John Ferlan jferlan at redhat.com
Wed Mar 30 20:29:19 UTC 2016



On 03/21/2016 01:28 PM, Andrea Bolognani wrote:
> Implement support for saving GIC capabilities in the cache and
> read them back.
> ---
>  src/qemu/qemu_capabilities.c | 87 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 87 insertions(+)
> 

This is more related to patch 2 and I think would need to be in place
for patch 5 to work properly given the right circumstances...

> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 64007f0..23c3740 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -2906,6 +2906,77 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename,
>      }
>      VIR_FREE(nodes);
>  
> +    if ((n = virXPathNodeSet("./gic", ctxt, &nodes)) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("failed to parse qemu capabilities gic"));
> +        goto cleanup;
> +    }
> +    if (n > 0) {
> +        unsigned int uintValue;
> +        bool boolValue;
> +
> +        qemuCaps->ngicCapabilities = n;
> +        if (VIR_ALLOC_N(qemuCaps->gicCapabilities, n) < 0)
> +            goto cleanup;
> +
> +        for (i = 0; i < n; i++) {
> +            virGICCapabilityPtr cap = &qemuCaps->gicCapabilities[i];
> +
> +            if (!(str = virXMLPropString(nodes[i], "version"))) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("missing GIC version "
> +                                 "in QEMU capabilities cache"));
> +                goto cleanup;
> +            }
> +            if (str &&
> +                virStrToLong_ui(str, NULL, 10, &uintValue) < 0) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("malformed GIC version "
> +                                 "in QEMU capabilities cache"));
> +                goto cleanup;
> +            }
> +            cap->version = uintValue;
> +            VIR_FREE(str);
> +
> +            if (!(str = virXMLPropString(nodes[i], "kernel"))) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("missing in-kernel GIC information "
> +                                 "in QEMU capabilities cache"));
> +                goto cleanup;
> +            }
> +            if (str &&
> +                !(boolValue = STREQ(str, "true")) &&
> +                STRNEQ(str, "false")) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("malformed in-kernel GIC information "
> +                                 "in QEMU capabilities cache"));
> +                goto cleanup;
> +            }
> +            if (boolValue)
> +                cap->implementation |= VIR_GIC_IMPLEMENTATION_KERNEL;
> +            VIR_FREE(str);
> +
> +            if (!(str = virXMLPropString(nodes[i], "emulated"))) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("missing emulated GIC information "
> +                                 "in QEMU capabilities cache"));
> +                goto cleanup;
> +            }
> +            if (str &&
> +                !(boolValue = STREQ(str, "true")) &&
> +                STRNEQ(str, "false")) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("malformed emulated GIC information "
> +                                 "in QEMU capabilities cache"));
> +                goto cleanup;
> +            }
> +            if (boolValue)
> +                cap->implementation |= VIR_GIC_IMPLEMENTATION_EMULATED;


Since these are processed as either/or in patch 5 based on virttype, I'm
beginning to think perhaps you'd have :

<gic version='#' type='{kernel|emulated}'/>

but this works, I'm still trying to process the whole domaincaps code
and what the use case would be. It looks like merely the output to
domcapabilities. In which case, I'm wonder if printing the gic_version
inside <arch> would be sufficient.

John
> +            VIR_FREE(str);
> +        }
> +    }
> +    VIR_FREE(nodes);
> +
>      ret = 0;
>   cleanup:
>      VIR_FREE(str);
> @@ -2972,6 +3043,22 @@ virQEMUCapsSaveCache(virQEMUCapsPtr qemuCaps, const char *filename)
>                            qemuCaps->machineMaxCpus[i]);
>      }
>  
> +    for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
> +        virGICCapabilityPtr cap;
> +        bool kernel;
> +        bool emulated;
> +
> +        cap = &qemuCaps->gicCapabilities[i];
> +        kernel = (cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL);
> +        emulated = (cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED);
> +
> +        virBufferAsprintf(&buf,
> +                          "<gic version='%d' kernel='%s' emulated='%s'/>\n",
> +                          cap->version,
> +                          kernel ? "true" : "false",
> +                          emulated ? "true" : "false");
> +    }
> +
>      virBufferAdjustIndent(&buf, -2);
>      virBufferAddLit(&buf, "</qemuCaps>\n");
>  
> 




More information about the libvir-list mailing list