From 848e7ff2b3f0e756aee4c20e452d59470998fe8a Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Thu, 1 Sep 2016 09:29:01 -0400 Subject: [PATCH] conf: new function virDomainPCIAddressReserveNextAddr() 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). --- src/conf/domain_addr.c | 44 +++++++++++++++++++++++++++++++++++----- src/conf/domain_addr.h | 7 +++++++ src/libvirt_private.syms | 1 + 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 1e96fe9730..ebbfab6f40 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -693,29 +693,63 @@ virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs, return 0; } + +/** + * virDomainPCIAddressReserveNextAddr: + * + * @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 + * + * 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. + * + * 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 0072a08303..904d060119 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 bf503a58cc..a7d268ac60 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -102,6 +102,7 @@ virDomainPCIAddressFlagsCompatible; virDomainPCIAddressGetNextSlot; virDomainPCIAddressReleaseSlot; virDomainPCIAddressReserveAddr; +virDomainPCIAddressReserveNextAddr; virDomainPCIAddressReserveNextSlot; virDomainPCIAddressReserveSlot; virDomainPCIAddressSetAlloc;