There is an existing virDomainPCIAddressReserveNextSlot() which will reserve all functions of the next available PCI slot. One place in the qemu PCI address assignment code requires reserving a *single* function of the next available PCI slot. This patch modifies and renames virDomainPCIAddressReserveNextSlot() so that it can fulfill both the original purpose and the need to reserve a single function. (This is being done so that the abovementioned code in qemu can have its "kind of open coded" solution replaced with a call to this new function). --- Changes: Fixed indentation and comments, and removed unnecessary setting of lastaddr.function and lastaddr.multi. src/conf/domain_addr.c | 49 +++++++++++++++++++++++++++++++++++++++++++----- src/conf/domain_addr.h | 7 +++++++ src/libvirt_private.syms | 1 + 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 080d882..1710220 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -691,29 +691,68 @@ virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs, return 0; } + +/** + * virDomainPCIAddressReserveNextAddr: + * + * find the next *completely unreserved* slot with compatible + * connection @flags, mark either one function or the entire + * slot as in-use (according to @function and @reserveEntireSlot), + * and set @dev->addr.pci with this newly reserved address. + * + * @addrs: a set of PCI addresses. + * + * @dev: virDomainDeviceInfo that should get the new address. + * + * @flags: CONNECT_TYPE flags for the device that needs an address. + * + * @function: which function on the slot to mark as reserved + * (if @reserveEntireSlot is false) + * + * @reserveEntireSlot: true to reserve all functions on the new slot, + * false to reserve just @function + * + * + * returns 0 on success, or -1 on failure. + */ int -virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs, +virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev, - virDomainPCIConnectFlags flags) + virDomainPCIConnectFlags flags, + unsigned int function, + bool reserveEntireSlot) { virPCIDeviceAddress addr; + if (virDomainPCIAddressGetNextSlot(addrs, &addr, flags) < 0) return -1; - if (virDomainPCIAddressReserveSlot(addrs, &addr, flags) < 0) + addr.function = reserveEntireSlot ? 0 : function; + + if (virDomainPCIAddressReserveAddr(addrs, &addr, flags, reserveEntireSlot, false) < 0) return -1; + addrs->lastaddr = addr; + addrs->lastFlags = flags; + if (!addrs->dryRun) { dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; dev->addr.pci = addr; } - addrs->lastaddr = addr; - addrs->lastFlags = flags; return 0; } +int +virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs, + virDomainDeviceInfoPtr dev, + virDomainPCIConnectFlags flags) +{ + return virDomainPCIAddressReserveNextAddr(addrs, dev, flags, 0, true); +} + + static char* virDomainCCWAddressAsString(virDomainDeviceCCWAddressPtr addr) { diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index 0072a08..904d060 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -160,6 +160,13 @@ int virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs, virDomainPCIConnectFlags flags) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, + virDomainDeviceInfoPtr dev, + virDomainPCIConnectFlags flags, + unsigned int function, + bool reserveEntireSlot) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + int virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev, virDomainPCIConnectFlags flags) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 55b6a24..9f9512a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -102,6 +102,7 @@ virDomainPCIAddressFlagsCompatible; virDomainPCIAddressGetNextSlot; virDomainPCIAddressReleaseSlot; virDomainPCIAddressReserveAddr; +virDomainPCIAddressReserveNextAddr; virDomainPCIAddressReserveNextSlot; virDomainPCIAddressReserveSlot; virDomainPCIAddressSetAlloc; -- 2.7.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list