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) {
+ 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;
--
1.7.12