From: Martin Kletzander Date: Wed, 12 Sep 2012 22:10:56 +0000 (+0200) Subject: Add support for EOI with APIC X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=4a8b7cba80cf64dac63da3faad1b06304413e766;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git Add support for EOI with APIC 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 element in because this should be tri-state option (cannot be handled as standalone feature). --- diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index fc32c7054..c05f3df9c 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1018,6 +1018,13 @@
ACPI is useful for power management, for example, with KVM guests it is required for graceful shutdown to work.
+
apic
+
APIC allows the use of programmable IRQ + management. Since 0.10.2 (QEMU only) + there is an optional attribute eoi with values "on" + and "off" which toggles the availability of EOI (End of + Interrupt) for the guest. +
hap
Enable use of Hardware Assisted Paging if available in the hardware. diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 916872d59..d70f0c25e 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2910,7 +2910,14 @@ - + + + + on + off + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 02048c778..75756c4e8 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", @@ -8840,6 +8845,21 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, goto error; } def->features |= (1 << val); + if (val == VIR_DOMAIN_FEATURE_APIC) { + tmp = virXPathString("string(./features/apic/@eoi)", ctxt); + if (tmp) { + int eoi; + if ((eoi = virDomainApicEoiTypeFromString(tmp)) <= 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown value for attribute eoi: %s"), + tmp); + VIR_FREE(tmp); + goto error; + } + def->apic_eoi = eoi; + VIR_FREE(tmp); + } + } } VIR_FREE(nodes); } @@ -13751,7 +13771,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, " \n"); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 99718ebe3..b6fb0dbbf 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1370,6 +1370,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, @@ -1661,6 +1669,8 @@ struct _virDomainDef { virDomainOSDef os; char *emulator; int features; + /* enum virDomainApicEoi */ + int apic_eoi; virDomainClockDef clock; @@ -2125,6 +2135,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 8dfb4cee9..064e2a67d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -264,6 +264,8 @@ virBlkioDeviceWeightArrayClear; virDiskNameToBusDeviceIndex; virDiskNameToIndex; virDomainActualNetDefFree; +virDomainApicEoiTypeFromString; +virDomainApicEoiTypeToString; virDomainAssignDef; virDomainBlockedReasonTypeFromString; virDomainBlockedReasonTypeToString;