summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Skultety <eskultet@redhat.com>2015-01-23 13:17:42 +0100
committerJán Tomko <jtomko@redhat.com>2015-01-23 14:32:18 +0100
commit5d6904b9919cd15a5b079d4523b3bfd79f7b0726 (patch)
treed771dbaa87e519f8d83faf4f0c02a55f258b3ff9
parenta3ecd63e928ff39d73c1c14b0fb3be8addbc977b (diff)
downloadlibvirt-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.c23
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];