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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to