From 9838cad9cd9b7969162e4fe1546689e26af33902 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Sun, 16 Oct 2016 17:14:25 -0400 Subject: [PATCH] conf: use struct instead of int for each slot in virDomainPCIAddressBus 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 | 14 +++++++------- src/conf/domain_addr.h | 9 ++++++++- src/qemu/qemu_domain_address.c | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index b64fc18d68..cf16df0879 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -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); diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index bcec2c7e48..41b8c66aad 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -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; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index d2f7953f53..3bfd08932b 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -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; -- GitLab