diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5da63bf53ea309296b29527aec09dc5ecf474c69..9b50c6e249857255bbfc9ea9021e8c3818608af9 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; @@ -21410,16 +21409,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' differs: " - "source: '%s,%s=%s', destination: '%s,%s=%s'"), + "source: '%s=%s', destination: '%s=%s'"), featureName, - virTristateSwitchTypeToString(src->features[i]), - "driver", virDomainIOAPICTypeToString(src->ioapic), - virTristateSwitchTypeToString(dst->features[i]), - "driver", virDomainIOAPICTypeToString(dst->ioapic)); + "driver", virDomainIOAPICTypeToString(src->features[i]), + "driver", virDomainIOAPICTypeToString(dst->features[i])); return false; } break; @@ -26945,10 +26941,11 @@ virDomainDefFormatInternal(virDomainDefPtr def, break; case VIR_DOMAIN_FEATURE_IOAPIC: - if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { - virBufferAsprintf(buf, "\n", - virDomainIOAPICTypeToString(def->ioapic)); - } + if (def->features[i] == VIR_DOMAIN_IOAPIC_NONE) + break; + + virBufferAsprintf(buf, "\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 6cd81ef2de611a1eda2230824144c765aa583acf..f5fbe1d9737bf621b271fa7cb3381f23356de88f 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,21 +2353,18 @@ struct _virDomainDef { virDomainOSDef os; char *emulator; - /* These three options are of type virTristateSwitch, - * except VIR_DOMAIN_FEATURE_CAPABILITIES that is of type - * virDomainCapabilitiesPolicy */ + /* Most {caps_,hyperv_,kvm_,}feature options utilize a virTristateSwitch + * to handle support. A few assign specific data values to the option. + * See virDomainDefFeaturesCheckABIStability() for details. */ int features[VIR_DOMAIN_FEATURE_LAST]; - int apic_eoi; + int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST]; int hyperv_features[VIR_DOMAIN_HYPERV_LAST]; int kvm_features[VIR_DOMAIN_KVM_LAST]; 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 */ - int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST]; + int apic_eoi; virDomainClockDef clock; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 27736801dbc627e6876c178b9c03f720660e9a9b..ed19817c9ae56831aea752e93c92cdabdb4f280d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7223,14 +7223,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", @@ -7243,6 +7243,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 e943c675544e9c9e5819754bbe840d2d90f19e83..eeb9691ca4dbb943d5ecb265eac365e62193db1c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3320,7 +3320,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 not supported for "