These checks enforce some expectations that were, until now,
documented solely through comments or not spelled out at all.
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
src/qemu/qemu_postparse.c | 38 +++++++++++++++++++++++++++++++++++---
1 file changed, 35 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c
index ab39dfe138..e2004993f3 100644
--- a/src/qemu/qemu_postparse.c
+++ b/src/qemu/qemu_postparse.c
@@ -1383,6 +1383,41 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver,
break;
}
+ /* Sanity check. If the machine type does not support PCI, asking
+ * for PCI(e) root to be added is an obvious mistake */
+ if ((addPCIRoot ||
+ addPCIeRoot) &&
+ !qemuDomainSupportsPCI(def)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Machine type '%1$s' wants PCI but PCI is not supported"),
+ def->os.machine);
+ return -1;
+ }
+
+ /* Sanity check. If the machine type supports PCI, we need to reflect
+ * that fact in the XML or other parts of the machine handling code
+ * might misbehave */
+ if (qemuDomainSupportsPCI(def) &&
+ !addPCIRoot &&
+ !addPCIeRoot) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Machine type '%1$s' supports PCI but no PCI controller added"),
+ def->os.machine);
+ return -1;
+ }
+
+ /* Sanity check. USB controllers are PCI devices, so asking for a
+ * USB controller to be added but not for a PCI(e) root to be
+ * added at the same time is likely an oversight */
+ if (addDefaultUSB &&
+ !addPCIRoot &&
+ !addPCIeRoot) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Machine type '%1$s' wants USB but no PCI controller added"),
+ def->os.machine);
+ return -1;
+ }
+
if (addDefaultUSB && virDomainControllerFind(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0) < 0)
virDomainDefAddUSBController(def, 0, usbModel);
@@ -1391,9 +1426,6 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver,
pciRoot = virDomainControllerFind(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0);
- /* NB: any machine that sets addPCIRoot to true must also return
- * true from the function qemuDomainSupportsPCI().
- */
if (addPCIRoot) {
if (pciRoot >= 0) {
if (def->controllers[pciRoot]->model != VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) {
--
2.50.1