[libvirt] [PATCH 6/9] Add functions for adding usb controllers to addrs
John Ferlan
jferlan at redhat.com
Wed Aug 12 22:10:51 UTC 2015
On 08/12/2015 10:52 AM, Ján Tomko wrote:
> ---
> src/conf/domain_addr.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++
> src/conf/domain_addr.h | 4 +++
> src/libvirt_private.syms | 1 +
> 3 files changed, 93 insertions(+)
>
Ran the series through Coverity as a first pass... Figured I'd report
what was spewed first before digging in deeper...
> diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
> index 3962357..024d47b 100644
> --- a/src/conf/domain_addr.c
> +++ b/src/conf/domain_addr.c
> @@ -1239,3 +1239,91 @@ void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs)
> VIR_FREE(addrs->buses);
> VIR_FREE(addrs);
> }
> +
> +
> +static int virDomainUSBAddressSetAddController(virDomainUSBAddressSetPtr addrs,
> + virDomainControllerDefPtr cont)
> +{
> + virDomainUSBAddressHubPtr hub = NULL;
> + size_t ports = 0;
> + int ret = -1;
> + int model = cont->model;
> +
> + VIR_DEBUG("addrs=%p controller type=%d model=%d",
> + addrs, cont->type, cont->model);
> +
> + if (VIR_ALLOC(hub) < 0)
> + goto cleanup;
> +
> + if (model == -1)
> + model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
> +
> + switch ((virDomainControllerModelUSB)model) {
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI:
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI:
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI:
> + ports = 2;
> + break;
> +
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
> + ports = 6;
> + break;
> +
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1:
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2:
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3:
> + return 0;
> + /* FIXME * check the companions? */
> + ports = 2;
> + break;
I'm sure you realize Coverity would choke here... between 'hub' not
being freed and ports=2 not reachable.
> +
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI:
> + ports = 3;
> + break;
> +
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI:
> + ports = 15;
> +
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE:
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST:
> + ret = 0;
> + goto cleanup;
> + }
> +
> + if (cont->idx >= addrs->nbuses) {
> + if (VIR_EXPAND_N(addrs->buses, addrs->nbuses, cont->idx - addrs->nbuses + 1) < 0)
> + goto cleanup;
> + }
> +
> + if (VIR_ALLOC_N(hub->ports, ports + 1) < 0)
> + goto cleanup;
> + hub->nports = ports + 1;
> +
> + VIR_DEBUG("Added %zu ports on hub %p", hub->nports - 1, hub);
> +
> + /* FIXME: is there a bus already? */
> + addrs->buses[cont->idx] = hub;
> + hub = NULL;
> +
> + ret = 0;
> + cleanup:
> + VIR_FREE(hub);
> + return ret;
> +}
> +
> +
> +int virDomainUSBAddressSetAddControllers(virDomainUSBAddressSetPtr addrs,
> + virDomainDefPtr def)
> +{
> + size_t i;
> +
> + for (i = 0; i < def->ncontrollers; i++) {
> + virDomainControllerDefPtr cont = def->controllers[i];
> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) {
> + if (virDomainUSBAddressSetAddController(addrs, cont) < 0)
> + return -1;
> + }
> + }
> + return 0;
> +}
> diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
> index dcf86d4..64d35e9 100644
> --- a/src/conf/domain_addr.h
> +++ b/src/conf/domain_addr.h
> @@ -263,6 +263,10 @@ typedef struct _virDomainUSBAddressSet virDomainUSBAddressSet;
> typedef virDomainUSBAddressSet *virDomainUSBAddressSetPtr;
>
> virDomainUSBAddressSetPtr virDomainUSBAddressSetCreate(void);
> +
> +int virDomainUSBAddressSetAddControllers(virDomainUSBAddressSetPtr addrs,
> + virDomainDefPtr def)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs);
>
> #endif /* __DOMAIN_ADDR_H__ */
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index a628d00..7db4839 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -108,6 +108,7 @@ virDomainPCIAddressSlotInUse;
> virDomainPCIAddressValidate;
> virDomainUSBAddressGetPortBuf;
> virDomainUSBAddressGetPortString;
> +virDomainUSBAddressSetAddControllers;
> virDomainUSBAddressSetCreate;
> virDomainUSBAddressSetFree;
> virDomainVirtioSerialAddrAssign;
>
More information about the libvir-list
mailing list