]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: use struct instead of int for each slot in virDomainPCIAddressBus
authorLaine Stump <laine@laine.org>
Sun, 16 Oct 2016 21:14:25 +0000 (17:14 -0400)
committerLaine Stump <laine@laine.org>
Wed, 11 Jan 2017 09:29:48 +0000 (04:29 -0500)
When keeping track of which functions of which slots are allocated, we
will need to have more information than just the current bitmap with a
bit for each function that is currently stored for each slot in a
virDomainPCIAddressBus. To prepare for adding more per-slot info, this
patch changes "uint8_t slots" into "virDomainPCIAddressSlot slot", which
currently has a single member named "functions" that serves the same
purpose previously served directly by "slots".

src/conf/domain_addr.c
src/conf/domain_addr.h
src/qemu/qemu_domain_address.c

index b64fc18d68d6d81a6e6152aebc433bdc2425337a..cf16df0879628937c70c08e91a681864eee2b687 100644 (file)
@@ -522,7 +522,7 @@ bool
 virDomainPCIAddressSlotInUse(virDomainPCIAddressSetPtr addrs,
                              virPCIDeviceAddressPtr addr)
 {
-    return !!addrs->buses[addr->bus].slots[addr->slot];
+    return !!addrs->buses[addr->bus].slot[addr->slot].functions;
 }
 
 
@@ -563,17 +563,17 @@ virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs,
     bus = &addrs->buses[addr->bus];
 
     if (reserveEntireSlot) {
-        if (bus->slots[addr->slot]) {
+        if (bus->slot[addr->slot].functions) {
             virReportError(errType,
                            _("Attempted double use of PCI slot %s "
                              "(may need \"multifunction='on'\" for "
                              "device on function 0)"), addrStr);
             goto cleanup;
         }
-        bus->slots[addr->slot] = 0xFF; /* reserve all functions of slot */
+        bus->slot[addr->slot].functions = 0xFF; /* reserve all functions of slot */
         VIR_DEBUG("Reserving PCI slot %s (multifunction='off')", addrStr);
     } else {
-        if (bus->slots[addr->slot] & (1 << addr->function)) {
+        if (bus->slot[addr->slot].functions & (1 << addr->function)) {
             if (addr->function == 0) {
                 virReportError(errType,
                                _("Attempted double use of PCI Address %s"),
@@ -586,7 +586,7 @@ virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs,
             }
             goto cleanup;
         }
-        bus->slots[addr->slot] |= (1 << addr->function);
+        bus->slot[addr->slot].functions |= (1 << addr->function);
         VIR_DEBUG("Reserving PCI address %s", addrStr);
     }
 
@@ -653,7 +653,7 @@ int
 virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs,
                                virPCIDeviceAddressPtr addr)
 {
-    addrs->buses[addr->bus].slots[addr->slot] &= ~(1 << addr->function);
+    addrs->buses[addr->bus].slot[addr->slot].functions &= ~(1 << addr->function);
     return 0;
 }
 
@@ -674,7 +674,7 @@ virDomainPCIAddressReleaseSlot(virDomainPCIAddressSetPtr addrs,
     if (!virDomainPCIAddressValidate(addrs, addr, addrStr, flags, false))
         goto cleanup;
 
-    addrs->buses[addr->bus].slots[addr->slot] = 0;
+    addrs->buses[addr->bus].slot[addr->slot].functions = 0;
     ret = 0;
  cleanup:
     VIR_FREE(addrStr);
index bcec2c7e486136aad64c92c6cfcb9016aedb51a2..41b8c66aad915a9d5dc1f9bc5f5a488bea00f3dd 100644 (file)
@@ -70,6 +70,13 @@ typedef enum {
 virDomainPCIConnectFlags
 virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model);
 
+typedef struct {
+    /* each function is represented by one bit, set if that function is
+     * in use by a device, or clear if it isn't.
+     */
+    uint8_t functions;
+} virDomainPCIAddressSlot;
+
 typedef struct {
     virDomainControllerModelPCI model;
     /* flags and min/max can be computed from model, but
@@ -80,7 +87,7 @@ typedef struct {
     /* Each bit in a slot represents one function on that slot. If the
      * bit is set, that function is in use by a device.
      */
-    uint8_t slots[VIR_PCI_ADDRESS_SLOT_LAST + 1];
+    virDomainPCIAddressSlot slot[VIR_PCI_ADDRESS_SLOT_LAST + 1];
 } virDomainPCIAddressBus;
 typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr;
 
index d2f7953f53b9d3b5e04bf5edad7973dca7ae9f57..3bfd08932b3e23e5b5c285868bf2b7a14470e2d8 100644 (file)
@@ -1504,7 +1504,7 @@ qemuDomainPCIBusFullyReserved(virDomainPCIAddressBusPtr bus)
     size_t i;
 
     for (i = bus->minSlot; i <= bus->maxSlot; i++)
-        if (!bus->slots[i])
+        if (!bus->slot[i].functions)
             return false;
 
     return true;