
On 05/11/2014 08:48 AM, Roman Bogorodskiy wrote:
Move sharable PCI handling functions to domain_addr.[ch], and change theirs prefix from 'qemu' to 'vir':
- virDomainPCIAddressAsString; - virDomainPCIAddressBusSetModel; - virDomainPCIAddressEnsureAddr; - virDomainPCIAddressFlagsCompatible; - virDomainPCIAddressGetNextSlot; - virDomainPCIAddressReleaseSlot; - virDomainPCIAddressReserveAddr; - virDomainPCIAddressReserveNextSlot; - virDomainPCIAddressReserveSlot; - virDomainPCIAddressSetFree; - virDomainPCIAddressSetGrow; - virDomainPCIAddressSlotInUse; - virDomainPCIAddressValidate;
The only change here is function names, the implementation itself stays untouched.
Extract common allocation code from DomainPCIAddressSetCreate into virDomainPCIAddressSetAlloc. --- po/POTFILES.in | 1 + src/conf/domain_addr.c | 542 ++++++++++++++++++++++++++++++++++++++ src/conf/domain_addr.h | 70 +++++ src/libvirt_private.syms | 17 ++ src/qemu/qemu_command.c | 671 ++++++----------------------------------------- src/qemu/qemu_command.h | 18 +- src/qemu/qemu_domain.c | 3 +- src/qemu/qemu_hotplug.c | 8 +- src/qemu/qemu_process.c | 2 +- 9 files changed, 718 insertions(+), 614 deletions(-)
+ +int +virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, + virDomainDeviceInfoPtr dev) +{ + int ret = -1; + char *addrStr = NULL; + /* Flags should be set according to the particular device, + * but only the caller knows the type of device. Currently this + * function is only used for hot-plug, though, and hot-plug is + * only supported for standard PCI devices, so we can safely use + * the setting below */ + virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_HOTPLUGGABLE | + VIR_PCI_CONNECT_TYPE_PCI); + + if (!(addrStr = virDomainPCIAddressAsString(&dev->addr.pci))) + goto cleanup; + + if (dev->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { + /* We do not support hotplug multi-function PCI device now, so we should + * reserve the whole slot. The function of the PCI device must be 0. + */ + if (dev->addr.pci.function != 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Only PCI device addresses with function=0" + " are supported")); + goto cleanup; + } + + if (!virDomainPCIAddressValidate(addrs, &dev->addr.pci, + addrStr, flags, true))
Indentation is off.
+ goto cleanup; + + ret = virDomainPCIAddressReserveSlot(addrs, &dev->addr.pci, flags); + } else { + ret = virDomainPCIAddressReserveNextSlot(addrs, dev, flags); + } + + cleanup: + VIR_FREE(addrStr); + return ret; +} +
diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index f5a5199..c59ef85 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -76,4 +76,74 @@ typedef virDomainPCIAddressSet *virDomainPCIAddressSetPtr;
+bool virDomainPCIAddressFlagsCompatible(virDevicePCIAddressPtr addr, + const char *addrStr, + virDomainPCIConnectFlags busFlags, + virDomainPCIConnectFlags devFlags, + bool reportError, + bool fromConfig) + ATTRIBUTE_NONNULL(1); + +bool virDomainPCIAddressValidate(virDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr, + const char *addrStr, + virDomainPCIConnectFlags flags, + bool fromConfig) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
For both of these, addrStr can be marked as ATTRIBUTE_NONNULL too.
+ + +int virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, + virDomainControllerModelPCI model) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
model is an enum, 0 is a valid value.
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ebf17a8..aeaadbd 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c
@@ -1240,7 +1240,7 @@ void qemuDomainCCWAddressSetFree(qemuDomainCCWAddressSetPtr addrs) static qemuDomainCCWAddressSetPtr qemuDomainCCWAddressSetCreate(void) { - qemuDomainCCWAddressSetPtr addrs = NULL; + qemuDomainCCWAddressSetPtr addrs = NULL;
if (VIR_ALLOC(addrs) < 0) goto error;
Unrelated whitespace change. ACK with the ATTRIBUTE_NONNULL removed for model. Jan