Instead of storing separately whether the feature is enabled
or not and what driver should be used, store both of them in
a single place.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
src/conf/domain_conf.c | 29 +++++++++++++----------------
src/conf/domain_conf.h | 11 ++++++-----
src/qemu/qemu_command.c | 5 +++--
src/qemu/qemu_domain.c | 2 +-
4 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 170c56665..19884ec13 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -900,6 +900,7 @@ VIR_ENUM_IMPL(virDomainLoader,
VIR_ENUM_IMPL(virDomainIOAPIC,
VIR_DOMAIN_IOAPIC_LAST,
+ "none",
"qemu",
"kvm")
@@ -5913,8 +5914,7 @@ virDomainDefValidateInternal(const virDomainDef *def)
if (def->iommu &&
def->iommu->intremap == VIR_TRISTATE_SWITCH_ON &&
- (def->features[VIR_DOMAIN_FEATURE_IOAPIC] != VIR_TRISTATE_SWITCH_ON ||
- def->ioapic != VIR_DOMAIN_IOAPIC_QEMU)) {
+ def->features[VIR_DOMAIN_FEATURE_IOAPIC] != VIR_DOMAIN_IOAPIC_QEMU) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("IOMMU interrupt remapping requires split I/O APIC "
"(ioapic driver='qemu')"));
@@ -19224,14 +19224,13 @@ virDomainDefParseXML(xmlDocPtr xml,
tmp = virXMLPropString(nodes[i], "driver");
if (tmp) {
int value = virDomainIOAPICTypeFromString(tmp);
- if (value < 0) {
+ if (value < 0 || value == VIR_DOMAIN_IOAPIC_NONE) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unknown driver mode: %s"),
tmp);
goto error;
}
- def->ioapic = value;
- def->features[val] = VIR_TRISTATE_SWITCH_ON;
+ def->features[val] = value;
VIR_FREE(tmp);
}
break;
@@ -21408,16 +21407,13 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
break;
case VIR_DOMAIN_FEATURE_IOAPIC:
- if (src->features[i] != dst->features[i] ||
- src->ioapic != dst->ioapic) {
+ if (src->features[i] != dst->features[i]) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("State of feature '%s:%s' differs: "
- "source: '%s:%s', destination:
'%s:%s'"),
+ "source: '%s', destination:
'%s'"),
featureName, "driver",
- virTristateSwitchTypeToString(src->features[i]),
- virDomainIOAPICTypeToString(src->ioapic),
- virTristateSwitchTypeToString(dst->features[i]),
- virDomainIOAPICTypeToString(dst->ioapic));
+ virDomainIOAPICTypeToString(src->features[i]),
+ virDomainIOAPICTypeToString(dst->features[i]));
return false;
}
break;
@@ -26943,10 +26939,11 @@ virDomainDefFormatInternal(virDomainDefPtr def,
break;
case VIR_DOMAIN_FEATURE_IOAPIC:
- if (def->features[i] == VIR_TRISTATE_SWITCH_ON) {
- virBufferAsprintf(buf, "<ioapic
driver='%s'/>\n",
- virDomainIOAPICTypeToString(def->ioapic));
- }
+ if (def->features[i] == VIR_DOMAIN_IOAPIC_NONE)
+ break;
+
+ virBufferAsprintf(buf, "<ioapic
driver='%s'/>\n",
+ virDomainIOAPICTypeToString(def->features[i]));
break;
case VIR_DOMAIN_FEATURE_HPT:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 21e004515..20f0efc36 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1861,7 +1861,8 @@ struct _virDomainLoaderDef {
void virDomainLoaderDefFree(virDomainLoaderDefPtr loader);
typedef enum {
- VIR_DOMAIN_IOAPIC_QEMU = 0,
+ VIR_DOMAIN_IOAPIC_NONE = 0,
+ VIR_DOMAIN_IOAPIC_QEMU,
VIR_DOMAIN_IOAPIC_KVM,
VIR_DOMAIN_IOAPIC_LAST
@@ -2352,9 +2353,10 @@ struct _virDomainDef {
virDomainOSDef os;
char *emulator;
- /* These three options are of type virTristateSwitch,
- * except VIR_DOMAIN_FEATURE_CAPABILITIES that is of type
- * virDomainCapabilitiesPolicy */
+ /* Most of the values in {kvm_,hyperv_,}features are of type
+ * virTristateSwitch, but there are exceptions: for example,
+ * VIR_DOMAIN_FEATURE_CAPABILITIES is of type virDomainCapabilitiesPolicy,
+ * VIR_DOMAIN_FEATURE_IOAPIC is of type virDomainIOAPIC and so on */
int features[VIR_DOMAIN_FEATURE_LAST];
int apic_eoi;
int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
@@ -2362,7 +2364,6 @@ struct _virDomainDef {
unsigned int hyperv_spinlocks;
virGICVersion gic_version;
char *hyperv_vendor_id;
- virDomainIOAPIC ioapic;
virDomainHPTResizing hpt_resizing;
/* These options are of type virTristateSwitch: ON = keep, OFF = drop */
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 529079be0..3aabdf7a2 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7240,14 +7240,14 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
}
}
- if (def->features[VIR_DOMAIN_FEATURE_IOAPIC] == VIR_TRISTATE_SWITCH_ON) {
+ if (def->features[VIR_DOMAIN_FEATURE_IOAPIC] != VIR_DOMAIN_IOAPIC_NONE) {
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQCHIP)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("I/O APIC tuning is not supported by this "
"QEMU binary"));
goto cleanup;
}
- switch (def->ioapic) {
+ switch ((virDomainIOAPIC) def->features[VIR_DOMAIN_FEATURE_IOAPIC]) {
case VIR_DOMAIN_IOAPIC_QEMU:
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -7260,6 +7260,7 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
case VIR_DOMAIN_IOAPIC_KVM:
virBufferAddLit(&buf, ",kernel_irqchip=on");
break;
+ case VIR_DOMAIN_IOAPIC_NONE:
case VIR_DOMAIN_IOAPIC_LAST:
break;
}
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index ee720d328..cfea1f500 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -3234,7 +3234,7 @@ qemuDomainDefValidateFeatures(const virDomainDef *def)
switch ((virDomainFeature) i) {
case VIR_DOMAIN_FEATURE_IOAPIC:
- if (def->features[i] == VIR_TRISTATE_SWITCH_ON &&
+ if (def->features[i] != VIR_DOMAIN_IOAPIC_NONE &&
!ARCH_IS_X86(def->os.arch)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("The '%s' feature is only supported for %s
guests"),
--
2.14.3