Previous patch of this series fixed the issue with adding a new PCI bridge
when all the slots were reserved by devices with user specified addresses.
In case there are still some PCI devices waiting to get a slot reserved
by qemuAssignDevicePCISlots, this means a new bus needs to be
created along with a corresponding bridge controller. By adding an
additional check, this scenario now results in a reasonable error
instead of generating wrong qemu command line.
---
src/qemu/qemu_command.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a3dedbf..870771f 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1982,6 +1982,25 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
goto cleanup;
}
+
+ for (i = 0; i < def->ncontrollers; i++) {
+ /* check if every PCI bridge controller's ID is greater than
+ * the bus it is placed onto
+ */
+ virDomainControllerDefPtr cont = def->controllers[i];
+ int idx = cont->idx;
+ int bus = cont->info.addr.pci.bus;
+ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
+ cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE &&
+ idx <= bus) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("failed to create PCI bridge "
+ "on bus %d: too many devices with fixed "
+ "addresses"),
+ bus);
+ goto cleanup;
+ }
+ }
}
if (obj && obj->privateData) {
--
1.9.3