[libvirt] [PATCHv3 04/10] Introduce virDomainUSBAddressSet

Erik Skultety eskultet at redhat.com
Sat Jun 25 17:38:29 UTC 2016


On 23/06/16 09:45, Ján Tomko wrote:
> A new type to track USB addresses.
> 
> Every <controller type='usb' index='i'/> is represented by
> as a virDomainUSBAddressHub at buses[i].
> 

"represented by as..", I'd say something like "is represented by an
object of type virDomainUSBAddressHub where each of such objects can be
located at buses[i]" or something similar...

> Each of these hubs has up to 'nports' ports.
> If a port is occupied, it has the corresponding bit set in
> the 'ports' bitmap, e.g. port 1 would have the 0th bit set.
> If there is a hub on this port, then hubs[i] will point
> to this hub.
> ---
>  src/conf/domain_addr.c   | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/domain_addr.h   | 22 ++++++++++++++++++++++
>  src/libvirt_private.syms |  2 ++
>  3 files changed, 70 insertions(+)
> 
> diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
> index 1f5193c..a43657b 100644
> --- a/src/conf/domain_addr.c
> +++ b/src/conf/domain_addr.c
> @@ -1277,3 +1277,49 @@ virDomainUSBAddressPortFormat(unsigned int *port)
>          return NULL;
>      return virBufferContentAndReset(&buf);
>  }
> +
> +
> +virDomainUSBAddressSetPtr
> +virDomainUSBAddressSetCreate(void)
> +{
> +    virDomainUSBAddressSetPtr addrs;
> +
> +    if (VIR_ALLOC(addrs) < 0)
> +        return NULL;
> +
> +    return addrs;
> +}
> +
> +
> +static void
> +virDomainUSBAddressHubFree(virDomainUSBAddressHubPtr hub)
> +{
> +    size_t i;
> +
> +    if (!hub)
> +        return;
> +
> +    for (i = 0; i < hub->nports; i++) {
> +        if (hub->hubs[i])
> +            virDomainUSBAddressHubFree(hub->hubs[i]);
> +    }
> +    virBitmapFree(hub->ports);
> +    VIR_FREE(hub);
> +}
> +
> +
> +void
> +virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs)
> +{
> +    size_t i;
> +
> +    if (!addrs)
> +        return;
> +
> +    for (i = 0; i < addrs->nbuses; i++) {
> +        if (addrs->buses[i])
> +            virDomainUSBAddressHubFree(addrs->buses[i]);
> +    }
> +    VIR_FREE(addrs->buses);
> +    VIR_FREE(addrs);
> +}
> diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
> index 8efd512..51bbb61 100644
> --- a/src/conf/domain_addr.h
> +++ b/src/conf/domain_addr.h
> @@ -245,4 +245,26 @@ char *
>  virDomainUSBAddressPortFormat(unsigned int *port)
>      ATTRIBUTE_NONNULL(1);
>  
> +typedef struct _virDomainUSBAddressHub virDomainUSBAddressHub;
> +typedef virDomainUSBAddressHub *virDomainUSBAddressHubPtr;
> +struct _virDomainUSBAddressHub {
> +    /* indexes are shifted by one:
> +     * ports[0] represents port 1, because ports are numbered from 1 */
> +    virBitmapPtr ports;
> +    size_t nports;
> +    virDomainUSBAddressHubPtr *hubs;
> +};
> +
> +struct _virDomainUSBAddressSet {
> +    /* every <controller type='usb' index='i'> is represented
> +     * as a hub at buses[i] */
> +    virDomainUSBAddressHubPtr *buses;
> +    size_t nbuses;
> +};

At first, I wasn't really convinced by the data type name
"virDomainUSBAddressSet", but unfortunately I couldn't come up with
anything more descriptive, so I guess I'm okay with it.

> +typedef struct _virDomainUSBAddressSet virDomainUSBAddressSet;
> +typedef virDomainUSBAddressSet *virDomainUSBAddressSetPtr;
> +
> +virDomainUSBAddressSetPtr virDomainUSBAddressSetCreate(void);
> +void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs);
> +
>  #endif /* __DOMAIN_ADDR_H__ */
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 414d990..9e1bad7 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -111,6 +111,8 @@ virDomainPCIAddressValidate;
>  virDomainPCIControllerModelToConnectType;
>  virDomainUSBAddressPortFormat;
>  virDomainUSBAddressPortFormatBuf;
> +virDomainUSBAddressSetCreate;
> +virDomainUSBAddressSetFree;
>  virDomainVirtioSerialAddrAssign;
>  virDomainVirtioSerialAddrAutoAssign;
>  virDomainVirtioSerialAddrIsComplete;
> 

ACK

Erik




More information about the libvir-list mailing list