mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-21 13:39:15 +00:00
qemu: Fix auto-adding PCI bridge when all slots are reserved
Commit 93c8ca tried to fix the issue with auto-adding of a PCI bridge controller, but didn't work properly in all scenarios. This patch provides a better fix of the issue when all slots on a PCI bus are reserved by devices with user specified addresses and no additional bridges need to be created. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1132900
This commit is contained in:
parent
a3ecd63e92
commit
5d6904b991
@ -1910,6 +1910,8 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
|
|||||||
int nbuses = 0;
|
int nbuses = 0;
|
||||||
size_t i;
|
size_t i;
|
||||||
int rv;
|
int rv;
|
||||||
|
bool buses_reserved = true;
|
||||||
|
|
||||||
virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPE_PCI;
|
virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPE_PCI;
|
||||||
|
|
||||||
for (i = 0; i < def->ncontrollers; i++) {
|
for (i = 0; i < def->ncontrollers; i++) {
|
||||||
@ -1932,18 +1934,21 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
|
|||||||
if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0)
|
if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
for (i = 0; i < addrs->nbuses; i++) {
|
||||||
|
if (!qemuDomainPCIBusFullyReserved(&addrs->buses[i]))
|
||||||
|
buses_reserved = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reserve 1 extra slot for a (potential) bridge only if buses
|
||||||
|
* are not fully reserved yet
|
||||||
|
*/
|
||||||
|
if (!buses_reserved &&
|
||||||
|
virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (qemuAssignDevicePCISlots(def, addrs) < 0)
|
if (qemuAssignDevicePCISlots(def, addrs) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
for (i = 0; i < addrs->nbuses; i++) {
|
|
||||||
if (!qemuDomainPCIBusFullyReserved(&addrs->buses[i])) {
|
|
||||||
|
|
||||||
/* Reserve 1 extra slot for a (potential) bridge */
|
|
||||||
if (virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < addrs->nbuses; i++) {
|
for (i = 1; i < addrs->nbuses; i++) {
|
||||||
virDomainPCIAddressBusPtr bus = &addrs->buses[i];
|
virDomainPCIAddressBusPtr bus = &addrs->buses[i];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user