[libvirt] [PATCH v2 4/4] qemu: Add check for PCI bridge placement if there are too many PCI devices

Erik Skultety eskultet at redhat.com
Fri Jan 23 12:17:43 UTC 2015


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




More information about the libvir-list mailing list