From: Laine Stump Date: Wed, 21 Oct 2015 18:49:06 +0000 (-0400) Subject: qemu: don't assume slot 0 is unused/reserved. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7dbb5fce069def821226bc820986fedb608e7f1f;p=libvirt.git qemu: don't assume slot 0 is unused/reserved. When qemuAssignDevicePCISlots() is looking for companion controllers for a USB controller that has no PCI address specified, it initializes a virDevicePCIAddress to 0000:00:00.0, fills it in with the companion's address if one is found, then checks whether or not there was a find based on slot == 0. On a system with a single PCI bus, that is a valid way to check, because slot 0 is reserved, but on most other PCI buses, slot 0 is not reserved, and is open for use by any device. This patch adds a separate bool that is set when a companion is found rather than relying on the faulty information provided with "slot == 0". --- diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e711f3031a..15d2355904 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2538,11 +2538,14 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* USB2 needs special handling to put all companions in the same slot */ if (IS_USB2_CONTROLLER(def->controllers[i])) { virDevicePCIAddress addr = { 0, 0, 0, 0, false }; + bool foundAddr = false; + memset(&tmp_addr, 0, sizeof(tmp_addr)); for (j = 0; j < i; j++) { if (IS_USB2_CONTROLLER(def->controllers[j]) && def->controllers[j]->idx == def->controllers[i]->idx) { addr = def->controllers[j]->info.addr.pci; + foundAddr = true; break; } } @@ -2563,7 +2566,7 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, break; } - if (addr.slot == 0) { + if (!foundAddr) { /* This is the first part of the controller, so need * to find a free slot & then reserve a function */ if (virDomainPCIAddressGetNextSlot(addrs, &tmp_addr, flags) < 0)