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