diff options
author | Erik Skultety <eskultet@redhat.com> | 2015-01-23 13:17:42 +0100 |
---|---|---|
committer | Ján Tomko <jtomko@redhat.com> | 2015-01-23 14:32:18 +0100 |
commit | 5d6904b9919cd15a5b079d4523b3bfd79f7b0726 (patch) | |
tree | d771dbaa87e519f8d83faf4f0c02a55f258b3ff9 | |
parent | a3ecd63e928ff39d73c1c14b0fb3be8addbc977b (diff) | |
download | libvirt-5d6904b9919cd15a5b079d4523b3bfd79f7b0726.tar.gz |
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
-rw-r--r-- | src/qemu/qemu_command.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index dc1d0b4a6a..e598430d2d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1910,6 +1910,8 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, int nbuses = 0; size_t i; int rv; + bool buses_reserved = true; + virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPE_PCI; for (i = 0; i < def->ncontrollers; i++) { @@ -1932,18 +1934,21 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0) goto cleanup; - if (qemuAssignDevicePCISlots(def, addrs) < 0) - 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; - } + 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) + goto cleanup; + for (i = 1; i < addrs->nbuses; i++) { virDomainPCIAddressBusPtr bus = &addrs->buses[i]; |