[libvirt] [PATCH v3 03/13] Introduce PCI Multifunction device parser

Nikunj A Dadhania nikunj at linux.vnet.ibm.com
Tue May 24 12:09:52 UTC 2016


Shivaprasad G Bhat <shivaprasadbhat at gmail.com> writes:

> This patch just introduces the parser function used by
> the later patches. The parser disallows hostdevices to be
> used with other virtio devices simultaneously.
>
> Signed-off-by: Shivaprasad G Bhat <sbhat at linux.vnet.ibm.com>
> ---
>  src/conf/domain_conf.c   |  123 ++++++++++++++++++++++++++++++++++++++--------
>  src/conf/domain_conf.h   |   19 +++++++
>  src/libvirt_private.syms |    3 +
>  3 files changed, 124 insertions(+), 21 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index ed0c471..873a309 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -860,6 +860,36 @@ virDomainXMLOptionClassDispose(void *obj)
>          (xmlopt->config.privFree)(xmlopt->config.priv);
>  }
>
> +/* virDomainDeviceDefListAddCopy - add a *copy* of the device to this list */
> +int
> +virDomainDeviceDefListAddCopy(virDomainDeviceDefListPtr list,
> +                              virDomainDeviceDefPtr dev,
> +                              const virDomainDef *def,
> +                              virCapsPtr caps,
> +                              virDomainXMLOptionPtr xmlopt)
> +{
> +    virDomainDeviceDefPtr copy = virDomainDeviceDefCopy(dev, def, caps, xmlopt);
> +
> +    if (!copy)
> +        return -1;
> +    if (VIR_APPEND_ELEMENT(list->devs, list->count, copy) < 0) {
> +        virDomainDeviceDefFree(copy);
> +        return -1;
> +    }
> +    return 0;
> +}
> +
> +void virDomainDeviceDefListFree(virDomainDeviceDefListPtr list)
> +{
> +    size_t i;
> +
> +    if (!list)
> +        return;
> +    for (i = 0; i < list->count; i++)
> +        virDomainDeviceDefFree(list->devs[i]);
> +    VIR_FREE(list);
> +}
> +
>  /**
>   * virDomainKeyWrapCipherDefParseXML:
>   *
> @@ -12880,25 +12910,16 @@ virDomainMemoryDefParseXML(xmlNodePtr memdevNode,
>      return NULL;
>  }
>
> -
> -virDomainDeviceDefPtr
> -virDomainDeviceDefParse(const char *xmlStr,
> -                        const virDomainDef *def,
> -                        virCapsPtr caps,
> -                        virDomainXMLOptionPtr xmlopt,
> -                        unsigned int flags)
> +static
> +virDomainDeviceDefPtr virDomainDeviceDefParseXML(xmlNodePtr node,
> +                                                 const virDomainDef *def,
> +                                                 virCapsPtr caps,
> +                                                 virDomainXMLOptionPtr xmlopt,
> +                                                 xmlXPathContextPtr ctxt,
> +                                                 unsigned int flags)
>  {
> -    xmlDocPtr xml;
> -    xmlNodePtr node;
> -    xmlXPathContextPtr ctxt = NULL;
>      virDomainDeviceDefPtr dev = NULL;
>      char *netprefix;
> -
> -    if (!(xml = virXMLParseStringCtxt(xmlStr, _("(device_definition)"), &ctxt)))
> -        goto error;
> -
> -    node = ctxt->node;
> -
>      if (VIR_ALLOC(dev) < 0)
>          goto error;
>
> @@ -13031,14 +13052,33 @@ virDomainDeviceDefParse(const char *xmlStr,
>      if (virDomainDeviceDefPostParse(dev, def, caps, flags, xmlopt) < 0)
>          goto error;
>
> - cleanup:
> +    return dev;
> + error:
> +    return NULL;
> +}
> +
> +virDomainDeviceDefPtr
> +virDomainDeviceDefParse(const char *xmlStr,
> +                        const virDomainDef *def,
> +                        virCapsPtr caps,
> +                        virDomainXMLOptionPtr xmlopt,
> +                        unsigned int flags)
> +{
> +    xmlDocPtr xml;
> +    xmlNodePtr node;
> +    xmlXPathContextPtr ctxt = NULL;
> +    virDomainDeviceDefPtr dev = NULL;
> +
> +    if (!(xml = virXMLParseStringCtxt(xmlStr, _("(device_definition)"), &ctxt)))
> +        return NULL;
> +
> +    node = ctxt->node;
> +
> +    dev = virDomainDeviceDefParseXML(node, def, caps, xmlopt, ctxt, flags);
> +
>      xmlFreeDoc(xml);
>      xmlXPathFreeContext(ctxt);
>      return dev;
> -
> - error:
> -    VIR_FREE(dev);

Missed this ...


> -    goto cleanup;
>  }
>
>
> @@ -24365,3 +24405,44 @@ virDomainObjGetShortName(virDomainObjPtr vm)
>
>      return ret;
>  }
> +
> +
> +virDomainDeviceDefListPtr
> +virDomainDeviceDefParseXMLMany(const char *xml,
> +                               const virDomainDef *def,
> +                               virCapsPtr caps,
> +                               virDomainXMLOptionPtr xmlopt,
> +                               unsigned int flags)
> +{
> +    xmlXPathContextPtr ctxt = NULL;
> +    xmlDocPtr xmlPtr;
> +    xmlNodePtr node, root;
> +    virDomainDeviceDefPtr dev = NULL;
> +    virDomainDeviceDefListPtr devlist;
> +
> +    if (!(xmlPtr = virXMLParseStringCtxt(xml, _("(device_definition)"), &ctxt)))
> +        return NULL;
> +
> +    if (VIR_ALLOC(devlist) < 0)
> +         goto exit;
> +
> +    root = xmlDocGetRootElement(xmlPtr);
> +    node = root->children;
> +    while (node) {
> +        if (node->type == XML_ELEMENT_NODE) {
> +            dev = virDomainDeviceDefParseXML(node, def, caps, xmlopt, ctxt, flags);
> +            if (VIR_APPEND_ELEMENT(devlist->devs, devlist->count, dev) < 0) {
> +                virDomainDeviceDefFree(dev);
> +                virDomainDeviceDefListFree(devlist);
> +                goto exit;
> +            }
> +            dev = NULL;
> +        }
> +        node = node->next;
> +    }
> +
> + exit:
> +    xmlFreeDoc(xmlPtr);
> +    xmlXPathFreeContext(ctxt);
> +    return devlist;
> +}
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index b9e696d..ed188f1 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2462,6 +2462,20 @@ typedef enum {
>  typedef struct _virDomainXMLOption virDomainXMLOption;
>  typedef virDomainXMLOption *virDomainXMLOptionPtr;
>
> +struct virDomainDeviceDefList {
> +    virDomainDeviceDefPtr *devs;
> +    size_t count;
> +};
> +typedef struct virDomainDeviceDefList *virDomainDeviceDefListPtr;
> +
> +int
> +virDomainDeviceDefListAddCopy(virDomainDeviceDefListPtr list, virDomainDeviceDefPtr dev,
> +                              const virDomainDef *def,
> +                              virCapsPtr caps,
> +                              virDomainXMLOptionPtr xmlopt);
> +void virDomainDeviceDefListFree(virDomainDeviceDefListPtr list);
> +
> +
>  /* Called once after everything else has been parsed, for adjusting
>   * overall domain defaults.  */
>  typedef int (*virDomainDefPostParseCallback)(virDomainDefPtr def,
> @@ -2717,6 +2731,11 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(const char *xmlStr,
>                                                virCapsPtr caps,
>                                                virDomainXMLOptionPtr xmlopt,
>                                                unsigned int flags);
> +virDomainDeviceDefListPtr virDomainDeviceDefParseXMLMany(const char *xmlStr,
> +                                                         const virDomainDef *def,
> +                                                         virCapsPtr caps,
> +                                                         virDomainXMLOptionPtr xmlopt,
> +                                                         unsigned int flags);
>  virStorageSourcePtr virDomainDiskDefSourceParse(const char *xmlStr,
>                                                  const virDomainDef *def,
>                                                  virDomainXMLOptionPtr xmlopt,
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index e4953b7..0e8a887 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -249,7 +249,10 @@ virDomainDeviceAddressIsValid;
>  virDomainDeviceAddressTypeToString;
>  virDomainDeviceDefCopy;
>  virDomainDeviceDefFree;
> +virDomainDeviceDefListAddCopy;
> +virDomainDeviceDefListFree;
>  virDomainDeviceDefParse;
> +virDomainDeviceDefParseXMLMany;
>  virDomainDeviceFindControllerModel;
>  virDomainDeviceGetInfo;
>  virDomainDeviceInfoCopy;
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list