From: Andrea Bolognani Date: Thu, 10 Jul 2025 14:38:04 +0000 (+0200) Subject: qemu: Add sanity checks for auto-added PCI controllers X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=519cc637e8447f1538796b4c8c8db5ca2e925d18;p=thirdparty%2Flibvirt.git qemu: Add sanity checks for auto-added PCI controllers These checks enforce some expectations that were, until now, documented solely through comments or not spelled out at all. Signed-off-by: Andrea Bolognani Reviewed-by: Michal Privoznik Reviewed-by: Peter Krempa Reviewed-by: Ján Tomko --- diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index d5708fbff9..cf08e6e07c 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -1384,6 +1384,29 @@ 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; + } + if (addDefaultUSB && virDomainControllerFind(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0) < 0) virDomainDefAddUSBController(def, 0, usbModel); @@ -1392,9 +1415,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) {