On Thu, Sep 13, 2012 at 04:12:01PM +0200, Martin Kletzander wrote: > New options is added to support EOI (End of Interrupt) exposure for > guests. As it makes sense only when APIC is enabled, I added this into > the <apic> element in <features> because this should be tri-state > option (cannot be handled as standalone feature). > --- > docs/formatdomain.html.in | 7 +++++++ > docs/schemas/domaincommon.rng | 9 ++++++++- > src/conf/domain_conf.c | 35 ++++++++++++++++++++++++++++++++++- > src/conf/domain_conf.h | 11 +++++++++++ > src/libvirt_private.syms | 2 ++ > 5 files changed, 62 insertions(+), 2 deletions(-) > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index 503685f..66319d0 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -1018,6 +1018,13 @@ > <dd>ACPI is useful for power management, for example, with > KVM guests it is required for graceful shutdown to work. > </dd> > + <dt><code>apic</code></dt> > + <dd>APIC allows the use of programmable IRQ > + management. <span class="since">Since 0.10.2 (QEMU only)</span> > + there is an optional attribute <code>eoi</code> with values "on" > + and "off" which toggle the availability of EOI (End of > + Interrupt) for the guest. > + </dd> > <dt><code>hap</code></dt> > <dd>Enable use of Hardware Assisted Paging if available in > the hardware. > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index c2c6184..029c796 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -2859,7 +2859,14 @@ > </optional> > <optional> > <element name="apic"> > - <empty/> > + <optional> > + <attribute name="eoi"> > + <choice> > + <value>on</value> > + <value>off</value> > + </choice> > + </attribute> > + </optional> > </element> > </optional> > <optional> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 292cc9a..89c08da 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -110,6 +110,11 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, > "viridian", > "privnet") > > +VIR_ENUM_IMPL(virDomainApicEoi, VIR_DOMAIN_APIC_EOI_LAST, > + "default", > + "on", > + "off") > + > VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST, > "destroy", > "restart", > @@ -8621,6 +8626,28 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > goto error; > } > def->features |= (1 << val); > + if (val == VIR_DOMAIN_FEATURE_APIC) { > + char *attrstr = NULL; > + if (virAsprintf(&attrstr, > + "string(./features/%s/@eoi)", > + nodes[i]->name) < 0) > + goto no_memory; > + > + tmp = virXPathString(attrstr, ctxt); > + if (tmp) { > + int eoi; > + if ((eoi = virDomainApicEoiTypeFromString(tmp)) < 0) { actually the test should be <= 0, because 0 maps to "default" which is not an external value, and not present in the RNG > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + _("unknown value for attribute eoi: %s"), > + nodes[i]->name); > + VIR_FREE(tmp); > + goto error; > + } > + def->apic_eoi = eoi; > + VIR_FREE(tmp); > + } > + VIR_FREE(attrstr); > + } > } > VIR_FREE(nodes); > } > @@ -13413,7 +13440,13 @@ virDomainDefFormatInternal(virDomainDefPtr def, > _("unexpected feature %d"), i); > goto cleanup; > } > - virBufferAsprintf(buf, " <%s/>\n", name); > + virBufferAsprintf(buf, " <%s", name); > + if (i == VIR_DOMAIN_FEATURE_APIC && def->apic_eoi) { > + virBufferAsprintf(buf, > + " eoi='%s'", > + virDomainApicEoiTypeToString(def->apic_eoi)); > + } > + virBufferAsprintf(buf, "/>\n"); > } > } > virBufferAddLit(buf, " </features>\n"); > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 3995c2d..86dae7d 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -1351,6 +1351,14 @@ enum virDomainFeature { > VIR_DOMAIN_FEATURE_LAST > }; > > +enum virDomainApicEoi { > + VIR_DOMAIN_APIC_EOI_DEFAULT = 0, > + VIR_DOMAIN_APIC_EOI_ON, > + VIR_DOMAIN_APIC_EOI_OFF, > + > + VIR_DOMAIN_APIC_EOI_LAST, > +}; > + > enum virDomainLifecycleAction { > VIR_DOMAIN_LIFECYCLE_DESTROY, > VIR_DOMAIN_LIFECYCLE_RESTART, > @@ -1642,6 +1650,8 @@ struct _virDomainDef { > virDomainOSDef os; > char *emulator; > int features; > + /* enum virDomainApicEoi */ > + int apic_eoi; > > virDomainClockDef clock; > > @@ -2104,6 +2114,7 @@ VIR_ENUM_DECL(virDomainTaint) > VIR_ENUM_DECL(virDomainVirt) > VIR_ENUM_DECL(virDomainBoot) > VIR_ENUM_DECL(virDomainFeature) > +VIR_ENUM_DECL(virDomainApicEoi) > VIR_ENUM_DECL(virDomainLifecycle) > VIR_ENUM_DECL(virDomainLifecycleCrash) > VIR_ENUM_DECL(virDomainPMState) > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index 0494e1f..5dd9313 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -263,6 +263,8 @@ virBlkioDeviceWeightArrayClear; > virDiskNameToBusDeviceIndex; > virDiskNameToIndex; > virDomainActualNetDefFree; > +virDomainApicEoiTypeFromString; > +virDomainApicEoiTypeToString; > virDomainAssignDef; > virDomainBlockedReasonTypeFromString; > virDomainBlockedReasonTypeToString; Except for that small glitch that looks good to me, ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list