[libvirt] [PATCH 00/11] clean up after "slot sharing" patches

Some of the patches that enabled sharing PCI slots by multiple pcie-root-ports made the idea of reserving an entire slot obsolete. To reduce confusion and misunderstandings, this patch series gets rid of the name "Slot" in all of the functions that reserve and release PCI addresses. None of these patches affect any functional change. This is a lot of patches, but each patch is trivial, I promise - most are simply renaming a single function, or changing one argument to some calls to a function. Laine Stump (11): conf: fix fromConfig argument to virDomainPCIAddressReserveAddr() conf: fix fromConfig argument to virDomainPCIAddressValidate() conf: rename virDomainPCIAddressGetNextSlot() to ...GetNextAddr() conf: eliminate virDomainPCIAddressReserveNextSlot() qemu: replace virDomainPCIAddressReserveAddr with virDomainPCIAddressReserveSlot conf: make virDomainPCIAddressReserveAddr() a static function conf: rename virDomainPCIAddressReserveAddr() to ...Internal() conf: rename virDomainPCIAddressReserveSlot() to ...Addr() qemu: remove qemuDomainPCIAddressReserveNextAddr() qemu: rename qemuDomainPCIAddressReserveNextSlot() to ...Addr() conf: eliminate virDomainPCIAddressReleaseSlot() in favor of ...Addr() src/bhyve/bhyve_device.c | 26 +++++++---- src/conf/domain_addr.c | 60 ++++++------------------ src/conf/domain_addr.h | 15 ------ src/libvirt_private.syms | 4 +- src/qemu/qemu_domain_address.c | 102 +++++++++++++++++++---------------------- 5 files changed, 78 insertions(+), 129 deletions(-) -- 2.7.4

Although setting virDomainPCIAddressReserveAddr()'s fromConfig=true is correct when a PCI addres is coming from a domain's config, the *true* purpose of the fromConfig argument is to lower restrictions on what kind of device can plug into what kind of controller - if fromConfig is true, then a PCIE_DEVICE can plug into a slot that is marked as only compatible with PCI_DEVICE (and vice versa), and the HOTPLUG flag is ignored. For a long time there have been several calls to virDomainPCIAddressReserveAddr() that have fromConfig incorrectly set to false - it's correct that the addresses aren't coming from user config, but they are coming from hardcoded exceptions in libvirt that should, if anything, pay *even less* attention to following the pciConnectFlags (under the assumption that the libvirt programmer knew what they were doing). See commit b87703cf7 for an example of an actual bug caused by the incorrect setting of the "fromConfig" argument to virDomainPCIAddressReserveAddr(). Although they haven't resulted in any reported bugs, this patch corrects all the other incorrect settings of fromConfig in calls to virDomainPCIAddressReserveAddr(). --- src/conf/domain_addr.c | 2 +- src/qemu/qemu_domain_address.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 3cf266f..f16766a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -533,7 +533,7 @@ virDomainPCIAddressReserveSlot(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags) { - return virDomainPCIAddressReserveAddr(addrs, addr, flags, false); + return virDomainPCIAddressReserveAddr(addrs, addr, flags, true); } int diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 2fa6b2b..31da2cb 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -1234,7 +1234,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, tmp_addr.slot = 0x1E; if (!virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, - flags, false) < 0) + flags, true) < 0) goto cleanup; cont->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; cont->info.addr.pci.domain = 0; @@ -1258,12 +1258,12 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, tmp_addr.function = 0; tmp_addr.multi = VIR_TRISTATE_SWITCH_ON; if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, - flags, false) < 0) + flags, true) < 0) goto cleanup; tmp_addr.function = 3; tmp_addr.multi = VIR_TRISTATE_SWITCH_ABSENT; if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, - flags, false) < 0) + flags, true) < 0) goto cleanup; } -- 2.7.4

fromConfig should be true if the caller want virDomainPCIAddressValidate() to loosen restrictions on its interpretation of the pciConnectFlags. In particular, either PCI_DEVICE or PCIE_DEVICE will be counted as equivalent to both, and HOTPLUG will be ignored. In a few cases where libvirt was manually overriding automatic address assignment, it was setting fromConfig to false when validating the hardcoded manual override. This patch changes those to fromConfig=true as a preemptive strike against any future bugs that might otherwise surface. --- src/conf/domain_addr.c | 2 +- src/qemu/qemu_domain_address.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index f16766a..627f901 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -603,7 +603,7 @@ virDomainPCIAddressReleaseSlot(virDomainPCIAddressSetPtr addrs, if (!(addrStr = virDomainPCIAddressAsString(addr))) goto cleanup; - if (!virDomainPCIAddressValidate(addrs, addr, addrStr, flags, false)) + if (!virDomainPCIAddressValidate(addrs, addr, addrStr, flags, true)) goto cleanup; addrs->buses[addr->bus].slot[addr->slot].functions = 0; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 31da2cb..745ec1b 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -1093,7 +1093,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def, if (!(addrStr = virDomainPCIAddressAsString(&tmp_addr))) goto cleanup; if (!virDomainPCIAddressValidate(addrs, &tmp_addr, - addrStr, flags, false)) + addrStr, flags, true)) goto cleanup; if (virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { @@ -1282,7 +1282,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, if (!(addrStr = virDomainPCIAddressAsString(&tmp_addr))) goto cleanup; if (!virDomainPCIAddressValidate(addrs, &tmp_addr, - addrStr, flags, false)) + addrStr, flags, true)) goto cleanup; if (virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { -- 2.7.4

With the advent of VIR_PCI_CONNECT_AGGREGATE_SLOT, the new name is more appropriate, since the address contained may be another address on the same slot as last time, not necessarily a new slot. --- src/conf/domain_addr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 627f901..a27ba41 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -712,7 +712,7 @@ virDomainPCIAddressFindUnusedFunctionOnBus(virDomainPCIAddressBusPtr bus, static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) -virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs, +virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr next_addr, int function, virDomainPCIConnectFlags flags) @@ -821,7 +821,7 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, { virPCIDeviceAddress addr; - if (virDomainPCIAddressGetNextSlot(addrs, &addr, function, flags) < 0) + if (virDomainPCIAddressGetNextAddr(addrs, &addr, function, flags) < 0) return -1; if (virDomainPCIAddressReserveAddr(addrs, &addr, flags, false) < 0) -- 2.7.4

Since we don't actually reserve an entire slot at a time anymore, the name of this function is just confusing, and it's almost identical in operation to virDomainPCIAddressReserveNextAddr() anyway, so remove the *Slot() function and replace calls to it with calls to *Addr(..., -1). --- src/bhyve/bhyve_device.c | 18 ++++++++++-------- src/conf/domain_addr.c | 11 +---------- src/conf/domain_addr.h | 5 ----- src/libvirt_private.syms | 1 - 4 files changed, 11 insertions(+), 24 deletions(-) diff --git a/src/bhyve/bhyve_device.c b/src/bhyve/bhyve_device.c index ca30e9f..4a1e1bd 100644 --- a/src/bhyve/bhyve_device.c +++ b/src/bhyve/bhyve_device.c @@ -100,19 +100,20 @@ bhyveAssignDevicePCISlots(virDomainDefPtr def, for (i = 0; i < def->nnets; i++) { if (!virDeviceInfoPCIAddressWanted(&def->nets[i]->info)) continue; - if (virDomainPCIAddressReserveNextSlot(addrs, - &def->nets[i]->info, - VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) + if (virDomainPCIAddressReserveNextAddr(addrs, &def->nets[i]->info, + VIR_PCI_CONNECT_TYPE_PCI_DEVICE, + -1) < 0) { goto error; + } } for (i = 0; i < def->ndisks; i++) { if (def->disks[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && !virPCIDeviceAddressIsEmpty(&def->disks[i]->info.addr.pci)) continue; - if (virDomainPCIAddressReserveNextSlot(addrs, - &def->disks[i]->info, - VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) + if (virDomainPCIAddressReserveNextAddr(addrs, &def->disks[i]->info, + VIR_PCI_CONNECT_TYPE_PCI_DEVICE, + -1) < 0) goto error; } @@ -122,9 +123,10 @@ bhyveAssignDevicePCISlots(virDomainDefPtr def, !virDeviceInfoPCIAddressWanted(&def->controllers[i]->info)) continue; - if (virDomainPCIAddressReserveNextSlot(addrs, + if (virDomainPCIAddressReserveNextAddr(addrs, &def->controllers[i]->info, - VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) + VIR_PCI_CONNECT_TYPE_PCI_DEVICE, + -1) < 0) goto error; } diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index a27ba41..8f64bef 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -571,7 +571,7 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, ret = virDomainPCIAddressReserveAddr(addrs, &dev->addr.pci, flags, true); } else { - ret = virDomainPCIAddressReserveNextSlot(addrs, dev, flags); + ret = virDomainPCIAddressReserveNextAddr(addrs, dev, flags, -1); } cleanup: @@ -839,15 +839,6 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, } -int -virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev, - virDomainPCIConnectFlags flags) -{ - return virDomainPCIAddressReserveNextAddr(addrs, dev, flags, -1); -} - - typedef struct { virPCIDeviceAddressPtr addr; bool isMulti; diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index 705e033..fcb622d 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -180,11 +180,6 @@ int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, int function) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -int virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev, - virDomainPCIConnectFlags flags) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); - bool virDomainPCIAddressIsMulti(const virDomainDef *def, virPCIDeviceAddressPtr addr) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 104d43e..b814e83 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -103,7 +103,6 @@ virDomainPCIAddressIsMulti; virDomainPCIAddressReleaseSlot; virDomainPCIAddressReserveAddr; virDomainPCIAddressReserveNextAddr; -virDomainPCIAddressReserveNextSlot; virDomainPCIAddressReserveSlot; virDomainPCIAddressSetAlloc; virDomainPCIAddressSetFree; -- 2.7.4

All occurences of the former use fromConfig=true, and that's exactly how virDomainPCIAddressReserveSlot() calls virDomainPCIaddressReserveAddr(), so just use *Slot() so that *Addr() can be made static to conf/domain_addr.c (both functions will be renamed in upcoming patches). --- src/qemu/qemu_domain_address.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 745ec1b..57f3e2a 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -887,8 +887,8 @@ qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, } } - if (virDomainPCIAddressReserveAddr(addrs, addr, - info->pciConnectFlags, true) < 0) { + if (virDomainPCIAddressReserveSlot(addrs, addr, + info->pciConnectFlags) < 0) { goto cleanup; } @@ -1210,9 +1210,11 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, assign = true; } if (assign) { - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, - flags, true) < 0) + if (virDomainPCIAddressReserveSlot(addrs, + &tmp_addr, flags) < 0) { goto cleanup; + } + cont->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; cont->info.addr.pci.domain = 0; cont->info.addr.pci.bus = 0; @@ -1233,9 +1235,11 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, memset(&tmp_addr, 0, sizeof(tmp_addr)); tmp_addr.slot = 0x1E; if (!virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, - flags, true) < 0) + if (virDomainPCIAddressReserveSlot(addrs, + &tmp_addr, flags) < 0) { goto cleanup; + } + cont->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; cont->info.addr.pci.domain = 0; cont->info.addr.pci.bus = 0; @@ -1257,13 +1261,12 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, tmp_addr.slot = 0x1F; tmp_addr.function = 0; tmp_addr.multi = VIR_TRISTATE_SWITCH_ON; - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, - flags, true) < 0) + if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) goto cleanup; + tmp_addr.function = 3; tmp_addr.multi = VIR_TRISTATE_SWITCH_ABSENT; - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, - flags, true) < 0) + if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) goto cleanup; } @@ -1561,10 +1564,10 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, if (foundAddr) { /* Reserve this function on the slot we found */ - if (virDomainPCIAddressReserveAddr(addrs, &addr, - cont->info.pciConnectFlags, - true) < 0) + if (virDomainPCIAddressReserveSlot(addrs, &addr, + cont->info.pciConnectFlags) < 0) { goto error; + } cont->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; cont->info.addr.pci = addr; -- 2.7.4

It is now only used in domain_addr.c. --- src/conf/domain_addr.c | 2 +- src/conf/domain_addr.h | 6 ------ src/libvirt_private.syms | 1 - 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 8f64bef..07a4312 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -475,7 +475,7 @@ virDomainPCIAddressSlotInUse(virDomainPCIAddressSetPtr addrs, * automatically created by libvirt, so it is an internal error (not * XML). */ -int +static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags, diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index fcb622d..653843f 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -150,12 +150,6 @@ int virDomainPCIAddressSetGrow(virDomainPCIAddressSetPtr addrs, virDomainPCIConnectFlags flags) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, - virPCIDeviceAddressPtr addr, - virDomainPCIConnectFlags flags, - bool fromConfig) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); - int virDomainPCIAddressReserveSlot(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b814e83..d978282 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -101,7 +101,6 @@ virDomainPCIAddressEnsureAddr; virDomainPCIAddressFlagsCompatible; virDomainPCIAddressIsMulti; virDomainPCIAddressReleaseSlot; -virDomainPCIAddressReserveAddr; virDomainPCIAddressReserveNextAddr; virDomainPCIAddressReserveSlot; virDomainPCIAddressSetAlloc; -- 2.7.4

This is in preparation for renaming virDomainPCIAddressReserveSlot() to virDomainPCIAddressReserveAddr(), which is a better description of what it does. --- src/conf/domain_addr.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 07a4312..28b3604 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -476,10 +476,10 @@ virDomainPCIAddressSlotInUse(virDomainPCIAddressSetPtr addrs, * XML). */ static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) -virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, - virPCIDeviceAddressPtr addr, - virDomainPCIConnectFlags flags, - bool fromConfig) +virDomainPCIAddressReserveAddrInternal(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr, + virDomainPCIConnectFlags flags, + bool fromConfig) { int ret = -1; char *addrStr = NULL; @@ -533,7 +533,7 @@ virDomainPCIAddressReserveSlot(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags) { - return virDomainPCIAddressReserveAddr(addrs, addr, flags, true); + return virDomainPCIAddressReserveAddrInternal(addrs, addr, flags, true); } int @@ -568,8 +568,8 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, addrStr, flags, true)) goto cleanup; - ret = virDomainPCIAddressReserveAddr(addrs, &dev->addr.pci, - flags, true); + ret = virDomainPCIAddressReserveAddrInternal(addrs, &dev->addr.pci, + flags, true); } else { ret = virDomainPCIAddressReserveNextAddr(addrs, dev, flags, -1); } @@ -824,7 +824,7 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, if (virDomainPCIAddressGetNextAddr(addrs, &addr, function, flags) < 0) return -1; - if (virDomainPCIAddressReserveAddr(addrs, &addr, flags, false) < 0) + if (virDomainPCIAddressReserveAddrInternal(addrs, &addr, flags, false) < 0) return -1; addrs->lastaddr = addr; -- 2.7.4

This function doesn't actually reserve an entire slot any more, it reserves a single PCI address, so this name is more appropriate. --- src/bhyve/bhyve_device.c | 8 ++++++-- src/conf/domain_addr.c | 2 +- src/conf/domain_addr.h | 2 +- src/libvirt_private.syms | 2 +- src/qemu/qemu_domain_address.c | 24 ++++++++++++------------ 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/bhyve/bhyve_device.c b/src/bhyve/bhyve_device.c index 4a1e1bd..97e81e1 100644 --- a/src/bhyve/bhyve_device.c +++ b/src/bhyve/bhyve_device.c @@ -53,8 +53,10 @@ bhyveCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, } } - if (virDomainPCIAddressReserveSlot(addrs, addr, VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) + if (virDomainPCIAddressReserveAddr(addrs, addr, + VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) { goto cleanup; + } ret = 0; cleanup: @@ -94,8 +96,10 @@ bhyveAssignDevicePCISlots(virDomainDefPtr def, memset(&lpc_addr, 0, sizeof(lpc_addr)); lpc_addr.slot = 0x1; - if (virDomainPCIAddressReserveSlot(addrs, &lpc_addr, VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &lpc_addr, + VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) { goto error; + } for (i = 0; i < def->nnets; i++) { if (!virDeviceInfoPCIAddressWanted(&def->nets[i]->info)) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 28b3604..e1cbe36 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -529,7 +529,7 @@ virDomainPCIAddressReserveAddrInternal(virDomainPCIAddressSetPtr addrs, int -virDomainPCIAddressReserveSlot(virDomainPCIAddressSetPtr addrs, +virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags) { diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index 653843f..f2cef4f 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -150,7 +150,7 @@ int virDomainPCIAddressSetGrow(virDomainPCIAddressSetPtr addrs, virDomainPCIConnectFlags flags) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -int virDomainPCIAddressReserveSlot(virDomainPCIAddressSetPtr addrs, +int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d978282..9a4db3b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -101,8 +101,8 @@ virDomainPCIAddressEnsureAddr; virDomainPCIAddressFlagsCompatible; virDomainPCIAddressIsMulti; virDomainPCIAddressReleaseSlot; +virDomainPCIAddressReserveAddr; virDomainPCIAddressReserveNextAddr; -virDomainPCIAddressReserveSlot; virDomainPCIAddressSetAlloc; virDomainPCIAddressSetFree; virDomainPCIAddressSetGrow; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 57f3e2a..a9ba3b3 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -887,7 +887,7 @@ qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, } } - if (virDomainPCIAddressReserveSlot(addrs, addr, + if (virDomainPCIAddressReserveAddr(addrs, addr, info->pciConnectFlags) < 0) { goto cleanup; } @@ -1074,7 +1074,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def, if (addrs->nbuses) { memset(&tmp_addr, 0, sizeof(tmp_addr)); tmp_addr.slot = 1; - if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) goto cleanup; } @@ -1109,7 +1109,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def, goto cleanup; } } else { - if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) goto cleanup; primaryVideo->info.addr.pci = tmp_addr; primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; @@ -1134,7 +1134,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def, VIR_DEBUG("PCI address 0:0:2.0 in use, future addition of a video" " device will not be possible without manual" " intervention"); - } else if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) { + } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) { goto cleanup; } } @@ -1210,7 +1210,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, assign = true; } if (assign) { - if (virDomainPCIAddressReserveSlot(addrs, + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) { goto cleanup; } @@ -1235,7 +1235,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, memset(&tmp_addr, 0, sizeof(tmp_addr)); tmp_addr.slot = 0x1E; if (!virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - if (virDomainPCIAddressReserveSlot(addrs, + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) { goto cleanup; } @@ -1261,12 +1261,12 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, tmp_addr.slot = 0x1F; tmp_addr.function = 0; tmp_addr.multi = VIR_TRISTATE_SWITCH_ON; - if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) goto cleanup; tmp_addr.function = 3; tmp_addr.multi = VIR_TRISTATE_SWITCH_ABSENT; - if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) goto cleanup; } @@ -1300,7 +1300,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, goto cleanup; } } else { - if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) goto cleanup; primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; primaryVideo->info.addr.pci = tmp_addr; @@ -1326,7 +1326,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, " device will not be possible without manual" " intervention"); virResetLastError(); - } else if (virDomainPCIAddressReserveSlot(addrs, + } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) { goto cleanup; } @@ -1348,7 +1348,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, !virDeviceInfoPCIAddressWanted(&sound->info)) { continue; } - if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) goto cleanup; sound->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; @@ -1564,7 +1564,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, if (foundAddr) { /* Reserve this function on the slot we found */ - if (virDomainPCIAddressReserveSlot(addrs, &addr, + if (virDomainPCIAddressReserveAddr(addrs, &addr, cont->info.pciConnectFlags) < 0) { goto error; } -- 2.7.4

This function is only called in two places, and the function itself is just adding a single argument and calling virDomainPCIAddressReserveNextAddr(), so we can remove it and instead call virDomainPCIAddressReserveNextAddr() directly. (The main motivation for doing this is to free up the name so that qemuDomainPCIAddressReserveNextSlot() can be renamed in the next patch, as its current name is now inaccurate and misleading). --- src/qemu/qemu_domain_address.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index a9ba3b3..80c8972 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -789,21 +789,11 @@ qemuDomainFillDevicePCIConnectFlags(virDomainDefPtr def, static int -qemuDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev, - unsigned int function) -{ - return virDomainPCIAddressReserveNextAddr(addrs, dev, - dev->pciConnectFlags, - function); -} - - -static int qemuDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev) { - return qemuDomainPCIAddressReserveNextAddr(addrs, dev, -1); + return virDomainPCIAddressReserveNextAddr(addrs, dev, + dev->pciConnectFlags, -1); } @@ -1574,8 +1564,9 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, } else { /* This is the first part of the controller, so need * to find a free slot & then reserve this function */ - if (qemuDomainPCIAddressReserveNextAddr(addrs, &cont->info, - addr.function) < 0) { + if (virDomainPCIAddressReserveNextAddr(addrs, &cont->info, + cont->info.pciConnectFlags, + addr.function) < 0) { goto error; } -- 2.7.4

This function doesn't actually reserve an entire slot any more, it reserves a single PCI address, so this name is more appropriate. --- src/qemu/qemu_domain_address.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 80c8972..5889f9f 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -789,7 +789,7 @@ qemuDomainFillDevicePCIConnectFlags(virDomainDefPtr def, static int -qemuDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs, +qemuDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev) { return virDomainPCIAddressReserveNextAddr(addrs, dev, @@ -1088,7 +1088,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def, if (virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { if (qemuDeviceVideoUsable) { - if (qemuDomainPCIAddressReserveNextSlot(addrs, + if (qemuDomainPCIAddressReserveNextAddr(addrs, &primaryVideo->info) < 0) { goto cleanup; } @@ -1280,7 +1280,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, if (virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { if (qemuDeviceVideoUsable) { - if (qemuDomainPCIAddressReserveNextSlot(addrs, + if (qemuDomainPCIAddressReserveNextAddr(addrs, &primaryVideo->info) < 0) goto cleanup; } else { @@ -1441,7 +1441,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, !virDeviceInfoPCIAddressWanted(&cont->info)) continue; - if (qemuDomainPCIAddressReserveNextSlot(addrs, &cont->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &cont->info) < 0) goto error; } } @@ -1452,7 +1452,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, /* Only support VirtIO-9p-pci so far. If that changes, * we might need to skip devices here */ - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->fss[i]->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->fss[i]->info) < 0) goto error; } @@ -1469,7 +1469,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, continue; } - if (qemuDomainPCIAddressReserveNextSlot(addrs, &net->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &net->info) < 0) goto error; } @@ -1487,7 +1487,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, continue; } - if (qemuDomainPCIAddressReserveNextSlot(addrs, &sound->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &sound->info) < 0) goto error; } @@ -1573,7 +1573,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, cont->info.addr.pci.multi = addr.multi; } } else { - if (qemuDomainPCIAddressReserveNextSlot(addrs, &cont->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &cont->info) < 0) goto error; } } @@ -1605,7 +1605,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, goto error; } - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->disks[i]->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->disks[i]->info) < 0) goto error; } @@ -1617,7 +1617,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, def->hostdevs[i]->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) continue; - if (qemuDomainPCIAddressReserveNextSlot(addrs, + if (qemuDomainPCIAddressReserveNextAddr(addrs, def->hostdevs[i]->info) < 0) goto error; } @@ -1627,7 +1627,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO && virDeviceInfoPCIAddressWanted(&def->memballoon->info)) { - if (qemuDomainPCIAddressReserveNextSlot(addrs, + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->memballoon->info) < 0) goto error; } @@ -1638,7 +1638,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, !virDeviceInfoPCIAddressWanted(&def->rngs[i]->info)) continue; - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->rngs[i]->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->rngs[i]->info) < 0) goto error; } @@ -1646,7 +1646,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, if (def->watchdog && def->watchdog->model == VIR_DOMAIN_WATCHDOG_MODEL_I6300ESB && virDeviceInfoPCIAddressWanted(&def->watchdog->info)) { - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->watchdog->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->watchdog->info) < 0) goto error; } @@ -1654,7 +1654,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, * assigned address. */ if (def->nvideos > 0 && virDeviceInfoPCIAddressWanted(&def->videos[0]->info)) { - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->videos[0]->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->videos[0]->info) < 0) goto error; } @@ -1662,7 +1662,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, if (!virDeviceInfoPCIAddressWanted(&def->videos[i]->info)) continue; - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->videos[i]->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->videos[i]->info) < 0) goto error; } @@ -1671,7 +1671,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, if (!virDeviceInfoPCIAddressWanted(&def->shmems[i]->info)) continue; - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->shmems[i]->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->shmems[i]->info) < 0) goto error; } for (i = 0; i < def->ninputs; i++) { @@ -1679,7 +1679,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, !virDeviceInfoPCIAddressWanted(&def->inputs[i]->info)) continue; - if (qemuDomainPCIAddressReserveNextSlot(addrs, &def->inputs[i]->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->inputs[i]->info) < 0) goto error; } for (i = 0; i < def->nparallels; i++) { @@ -1692,7 +1692,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, !virDeviceInfoPCIAddressWanted(&chr->info)) continue; - if (qemuDomainPCIAddressReserveNextSlot(addrs, &chr->info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &chr->info) < 0) goto error; } for (i = 0; i < def->nchannels; i++) { @@ -1909,7 +1909,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, } } if (!buses_reserved && - qemuDomainPCIAddressReserveNextSlot(addrs, &info) < 0) + qemuDomainPCIAddressReserveNextAddr(addrs, &info) < 0) goto cleanup; } @@ -1939,7 +1939,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, /* if there isn't an empty pcie-root-port, this will * cause one to be added */ - if (qemuDomainPCIAddressReserveNextSlot(addrs, &info) < 0) + if (qemuDomainPCIAddressReserveNextAddr(addrs, &info) < 0) goto cleanup; } @@ -1979,7 +1979,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, dev.data.controller = def->controllers[contIndex]; /* set connect flags so it will be properly addressed */ qemuDomainFillDevicePCIConnectFlags(def, &dev, qemuCaps); - if (qemuDomainPCIAddressReserveNextSlot(addrs, + if (qemuDomainPCIAddressReserveNextAddr(addrs, &dev.data.controller->info) < 0) goto cleanup; } -- 2.7.4

Surprisingly there was a virDomainPCIAddressReleaseAddr() function already, but it was completely unused. Since we don't reserve entire slots at once any more, there is no need to release entire slots either, so we just replace the single call to virDomainPCIAddressReleaseSlot() with a call to virDomainPCIAddressReleaseAddr() and remove the now unused function. The keen observer may be concerned that ...Addr() doesn't call virDomainPCIAddressValidate(), as ...Slot() did. But really the validation was pointless anyway - if the device hadn't been suitable to be connected at that address, it would have failed validation before every being reserved in the first place, so by definition it will pass validation when it is being unplugged. (And anyway, even if something "bad" happened and we managed to have a device incorrectly at the given address, we would still want to be able to free it up for use by a device that *did* validate properly). --- src/conf/domain_addr.c | 25 ------------------------- src/conf/domain_addr.h | 4 ---- src/libvirt_private.syms | 2 +- src/qemu/qemu_domain_address.c | 2 +- 4 files changed, 2 insertions(+), 31 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index e1cbe36..76e1db7 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -589,31 +589,6 @@ virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, return 0; } -int -virDomainPCIAddressReleaseSlot(virDomainPCIAddressSetPtr addrs, - virPCIDeviceAddressPtr addr) -{ - /* permit any kind of connection type in validation, since we - * already had it, and are giving it back. - */ - virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPES_MASK; - int ret = -1; - char *addrStr = NULL; - - if (!(addrStr = virDomainPCIAddressAsString(addr))) - goto cleanup; - - if (!virDomainPCIAddressValidate(addrs, addr, addrStr, flags, true)) - goto cleanup; - - addrs->buses[addr->bus].slot[addr->slot].functions = 0; - ret = 0; - cleanup: - VIR_FREE(addrStr); - return ret; -} - - virDomainPCIAddressSetPtr virDomainPCIAddressSetAlloc(unsigned int nbuses) { diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index f2cef4f..ccaccef 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -164,10 +164,6 @@ int virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -int virDomainPCIAddressReleaseSlot(virDomainPCIAddressSetPtr addrs, - virPCIDeviceAddressPtr addr) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); - int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev, virDomainPCIConnectFlags flags, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9a4db3b..982625c 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -100,7 +100,7 @@ virDomainPCIAddressBusSetModel; virDomainPCIAddressEnsureAddr; virDomainPCIAddressFlagsCompatible; virDomainPCIAddressIsMulti; -virDomainPCIAddressReleaseSlot; +virDomainPCIAddressReleaseAddr; virDomainPCIAddressReserveAddr; virDomainPCIAddressReserveNextAddr; virDomainPCIAddressSetAlloc; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 5889f9f..a9aa163 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -2310,7 +2310,7 @@ qemuDomainReleaseDeviceAddress(virDomainObjPtr vm, devstr = info->alias; if (virDeviceInfoPCIAddressPresent(info) && - virDomainPCIAddressReleaseSlot(priv->pciaddrs, + virDomainPCIAddressReleaseAddr(priv->pciaddrs, &info->addr.pci) < 0) VIR_WARN("Unable to release PCI address on %s", NULLSTR(devstr)); -- 2.7.4
participants (1)
-
Laine Stump