In order to be able to test for fully reserved PCI buses, assignment of
PCI slots for integrated devices needs to be moved to a separate function.
This also might be a good preparation if we decide to add support for
other chipsets as well.
---
src/qemu/qemu_command.c | 45 ++++++++++++++++++++++++++++++---------------
1 file changed, 30 insertions(+), 15 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 99b06ee..dbcc854 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1494,6 +1494,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true)))
goto cleanup;
+ if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0)
+ goto cleanup;
+
for (i = 0; i < nbuses; i++) {
if (qemuDomainPCIBusFullyReserved(&addrs->buses[i]))
resflags |= 1 << i;
@@ -1537,6 +1540,8 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
goto cleanup;
if (qemuDomainSupportsPCI(def)) {
+ if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0)
+ goto cleanup;
if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
goto cleanup;
}
@@ -1996,6 +2001,27 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
return ret;
}
+static int
+qemuValidateDevicePCISlotsChipsets(virDomainDefPtr def,
+ virQEMUCapsPtr qemuCaps,
+ virDomainPCIAddressSetPtr addrs)
+{
+ if ((STRPREFIX(def->os.machine, "pc-0.") ||
+ STRPREFIX(def->os.machine, "pc-1.") ||
+ STRPREFIX(def->os.machine, "pc-i440") ||
+ STREQ(def->os.machine, "pc") ||
+ STRPREFIX(def->os.machine, "rhel")) &&
+ qemuValidateDevicePCISlotsPIIX3(def, qemuCaps, addrs) < 0) {
+ return -1;
+ }
+
+ if (qemuDomainMachineIsQ35(def) &&
+ qemuDomainValidateDevicePCISlotsQ35(def, qemuCaps, addrs) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
/*
* This assigns static PCI slots to all configured devices.
@@ -2014,6 +2040,9 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
* - PIIX3 ISA bridge, IDE controller, something else unknown, USB controller (slot 1)
* - Video (slot 2)
*
+ * - These integrated devices were already added by
+ * qemuValidateDevicePCISlotsChipsets invoked right before this function
+ *
* Incrementally assign slots from 3 onwards:
*
* - Net
@@ -2031,27 +2060,13 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
*/
int
qemuAssignDevicePCISlots(virDomainDefPtr def,
- virQEMUCapsPtr qemuCaps,
+ virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED,
virDomainPCIAddressSetPtr addrs)
{
size_t i, j;
virDomainPCIConnectFlags flags;
virDevicePCIAddress tmp_addr;
- if ((STRPREFIX(def->os.machine, "pc-0.") ||
- STRPREFIX(def->os.machine, "pc-1.") ||
- STRPREFIX(def->os.machine, "pc-i440") ||
- STREQ(def->os.machine, "pc") ||
- STRPREFIX(def->os.machine, "rhel")) &&
- qemuValidateDevicePCISlotsPIIX3(def, qemuCaps, addrs) < 0) {
- goto error;
- }
-
- if (qemuDomainMachineIsQ35(def) &&
- qemuDomainValidateDevicePCISlotsQ35(def, qemuCaps, addrs) < 0) {
- goto error;
- }
-
/* PCI controllers */
for (i = 0; i < def->ncontrollers; i++) {
if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
--
1.9.3