mirror of https://gitee.com/openkylin/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".
This commit is contained in:
parent
2b6f6ad64b
commit
7dbb5fce06
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue