[libvirt] [PATCH v4 2/3] qemu: extract common PCI handling functions
Ján Tomko
jtomko at redhat.com
Tue May 13 09:21:11 UTC 2014
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140513/9c3443eb/attachment-0001.sig>
More information about the libvir-list
mailing list