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 | 50 +++++++++++++++++++++++++++++++++++++++++++-----
src/conf/domain_addr.h | 7 +++++++
src/libvirt_private.syms | 1 +
3 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
index cff2c3b..f735fb4 100644
--- a/src/conf/domain_addr.c
+++ b/src/conf/domain_addr.c
@@ -691,29 +691,69 @@ virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs,
return 0;
}
+/**
+ * virDomainPCIAddressReserveNextAddr:
+ *
+ * find the next *completely unreserved* slot with compatible
+ * connection @flags, and mark either one function or the entire
+ * slot (according to @function and @reserveEntireSlot).
+ *
+ * @addrs: a set of addresses - one bit for each function on each
+ * slot on each bus, set if in use, clear if not in use.
+ *
+ * @dev: virDomainDeviceInfo that should get the new address set.
+ *
+ * @flags: CONNECT_TYPE flags for the port we're looking for
+ *
+ * @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 (and dev->addr.pci set) 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->lastaddr.function = 0;
+ addrs->lastaddr.multi = VIR_TRISTATE_SWITCH_ABSENT;
+ 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 9610e0c..34ea3c6 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -99,6 +99,7 @@ virDomainPCIAddressFlagsCompatible;
virDomainPCIAddressGetNextSlot;
virDomainPCIAddressReleaseSlot;
virDomainPCIAddressReserveAddr;
+virDomainPCIAddressReserveNextAddr;
virDomainPCIAddressReserveNextSlot;
virDomainPCIAddressReserveSlot;
virDomainPCIAddressSetAlloc;
--
2.7.4