[libvirt] [RFC 6/6] qemu: Cache GIC capabilities
Andrea Bolognani
abologna at redhat.com
Wed Apr 6 15:29:01 UTC 2016
On Wed, 2016-03-30 at 16:29 -0400, John Ferlan wrote:
> On 03/21/2016 01:28 PM, Andrea Bolognani wrote:
> > 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.
I believe all of these were addressed in my previous comments.
Let me know if that was actually not the case :)
Cheers.
--
Andrea Bolognani
Software Engineer - Virtualization Team
More information about the libvir-list
mailing list