qemu: Add check for PCI bridge placement if there are too many PCI devices

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.
This commit is contained in:
Erik Skultety 2015-01-23 13:17:43 +01:00 committed by Ján Tomko
parent 5d6904b991
commit b7e6f2fc80

View File

@ -1981,6 +1981,25 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
if (qemuAssignDevicePCISlots(def, 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;
}
}
}
}