diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index db8fae4ad0..89cb171a93 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -68,23 +68,16 @@ bhyveDomainDefPostParse(virDomainDefPtr def, VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) return -1; - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } static int -bhyveDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, +bhyveDomainDeviceDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - if (virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) - return -1; - return 0; } diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0a6e3e1696..595d8a410d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1138,7 +1138,7 @@ virDomainBlkioDeviceParseXML(xmlNodePtr root, * Returns -1 if the domain definition would enable memory hotplug via the * tunable and reports an error. Otherwise returns 0. */ -int +static int virDomainDefCheckUnsupportedMemoryHotplug(virDomainDefPtr def) { /* memory hotplug tunables are not supported by this driver */ @@ -1160,7 +1160,7 @@ virDomainDefCheckUnsupportedMemoryHotplug(virDomainDefPtr def) * Returns -1 if the device definition describes a memory device and reports an * error. Otherwise returns 0. */ -int +static int virDomainDeviceDefCheckUnsupportedMemoryDevice(virDomainDeviceDefPtr dev) { /* This driver doesn't yet know how to handle memory devices */ @@ -4213,6 +4213,54 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev, } +#define UNSUPPORTED(FEATURE) (!((FEATURE) & xmlopt->config.features)) +/** + * virDomainDefPostParseCheckFeatures: + * @def: domain definition + * @xmlopt: XML parser option object + * + * This function checks that the domain configuration is supported according to + * the supported features for a given hypervisor. See virDomainDefFeatures and + * virDomainDefParserConfig. + * + * Returns 0 on success and -1 on error with an appropriate libvirt error. + */ +static int +virDomainDefPostParseCheckFeatures(virDomainDefPtr def, + virDomainXMLOptionPtr xmlopt) +{ + if (UNSUPPORTED(VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG) && + virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) + return -1; + + return 0; +} + + +/** + * virDomainDeviceDefPostParseCheckFeatures: + * @dev: device definition + * @xmlopt: XML parser option object + * + * This function checks that the device configuration is supported according to + * the supported features for a given hypervisor. See virDomainDefFeatures and + * virDomainDefParserConfig. + * + * Returns 0 on success and -1 on error with an appropriate libvirt error. + */ +static int +virDomainDeviceDefPostParseCheckFeatures(virDomainDeviceDefPtr dev, + virDomainXMLOptionPtr xmlopt) +{ + if (UNSUPPORTED(VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG) && + virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) + return -1; + + return 0; +} +#undef UNSUPPORTED + + static int virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def, @@ -4232,6 +4280,9 @@ virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, if ((ret = virDomainDeviceDefPostParseInternal(dev, def, caps, flags, xmlopt)) < 0) return ret; + if (virDomainDeviceDefPostParseCheckFeatures(dev, xmlopt) < 0) + return -1; + return 0; } @@ -4289,6 +4340,9 @@ virDomainDefPostParse(virDomainDefPtr def, if ((ret = virDomainDefPostParseInternal(def, caps, parseFlags)) < 0) return ret; + if (virDomainDefPostParseCheckFeatures(def, xmlopt) < 0) + return -1; + return 0; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9e953a0390..61eb766ae0 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2409,6 +2409,7 @@ typedef bool (*virDomainObjListACLFilter)(virConnectPtr conn, typedef enum { VIR_DOMAIN_DEF_FEATURE_WIDE_SCSI = (1 << 0), + VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG = (1 << 1), } virDomainDefFeatures; @@ -2501,9 +2502,6 @@ int virDomainObjWait(virDomainObjPtr vm); int virDomainObjWaitUntil(virDomainObjPtr vm, unsigned long long whenms); -int virDomainDefCheckUnsupportedMemoryHotplug(virDomainDefPtr def); -int virDomainDeviceDefCheckUnsupportedMemoryDevice(virDomainDeviceDefPtr dev); - void virDomainPanicDefFree(virDomainPanicDefPtr panic); void virDomainResourceDefFree(virDomainResourceDefPtr resource); void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4644203ce9..55c3047d3d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -204,7 +204,6 @@ virDomainDefAddImplicitControllers; virDomainDefAddUSBController; virDomainDefCheckABIStability; virDomainDefCheckDuplicateDiskInfo; -virDomainDefCheckUnsupportedMemoryHotplug; virDomainDefClearCCWAddresses; virDomainDefClearDeviceAliases; virDomainDefClearPCIAddresses; @@ -243,7 +242,6 @@ virDomainDefSetVcpusMax; virDomainDeleteConfig; virDomainDeviceAddressIsValid; virDomainDeviceAddressTypeToString; -virDomainDeviceDefCheckUnsupportedMemoryDevice; virDomainDeviceDefCopy; virDomainDeviceDefFree; virDomainDeviceDefParse; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 9d0da6827d..c8d09b182e 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -363,9 +363,6 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, } } - if (virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) - return -1; - return 0; } @@ -401,10 +398,6 @@ libxlDomainDefPostParse(virDomainDefPtr def, if (xenDomainDefAddImplicitInputDevice(def) < 0) return -1; - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index c3f7a564b3..3177a62f87 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -249,10 +249,6 @@ virLXCDomainDefPostParse(virDomainDefPtr def, !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) return -1; - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } @@ -269,10 +265,6 @@ virLXCDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, dev->data.chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE) dev->data.chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC; - - if (virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) - return -1; - return 0; } diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index a6834b373f..c2d54ad530 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -98,10 +98,6 @@ openvzDomainDefPostParse(virDomainDefPtr def, return -1; } - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } @@ -128,9 +124,6 @@ openvzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, return -1; } - if (virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) - return -1; - return 0; } diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index d1c40daaa2..55a63e7130 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1094,15 +1094,11 @@ openSSHSession(virConnectPtr conn, virConnectAuthPtr auth, static int -phypDomainDefPostParse(virDomainDefPtr def, +phypDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 97de6f74cf..4fcb85cb59 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1620,6 +1620,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = { .devicesPostParseCallback = qemuDomainDeviceDefPostParse, .domainPostParseCallback = qemuDomainDefPostParse, + .features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG, }; diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index d656704eb8..9fcdc84118 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -427,23 +427,16 @@ umlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, return -1; } - if (virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) - return -1; - return 0; } static int -umlDomainDefPostParse(virDomainDefPtr def, +umlDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 0152b353b0..c305eb597c 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -251,15 +251,11 @@ static char *vboxGenerateMediumName(PRUint32 storageBus, } static int -vboxDomainDefPostParse(virDomainDefPtr def, +vboxDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index e4e470a015..93f21c9a65 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -83,15 +83,11 @@ vmwareDataFreeFunc(void *data) } static int -vmwareDomainDefPostParse(virDomainDefPtr def, +vmwareDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 7263ee57e1..b04f549b42 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -525,15 +525,11 @@ VIR_ENUM_IMPL(virVMXControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST, */ static int -virVMXDomainDefPostParse(virDomainDefPtr def, +virVMXDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index eb9b17230a..6de7cb9bed 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -173,15 +173,11 @@ vzConnectGetCapabilities(virConnectPtr conn) } static int -vzDomainDefPostParse(virDomainDefPtr def, +vzDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 7628c949b0..3f5d80d9c4 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -361,9 +361,6 @@ xenDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, } } - if (virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) - return -1; - return 0; } @@ -387,10 +384,6 @@ xenDomainDefPostParse(virDomainDefPtr def, if (xenDomainDefAddImplicitInputDevice(def) <0) return -1; - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; } diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index f75f1389d9..a75a4f7a30 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -67,9 +67,6 @@ xenapiDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, return -1; } - if (virDomainDeviceDefCheckUnsupportedMemoryDevice(dev) < 0) - return -1; - return 0; } @@ -84,10 +81,6 @@ xenapiDomainDefPostParse(virDomainDefPtr def, if (xenDomainDefAddImplicitInputDevice(def) < 0) return -1; - /* memory hotplug tunables are not supported by this driver */ - if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) - return -1; - return 0; }