[libvirt] [PATCH 5/5] Supporting managed option for forward devs when using HOSTDEV mode

Laine Stump laine at laine.org
Mon Jun 11 17:20:15 UTC 2012


On 06/08/2012 11:30 AM, Shradha Shah wrote:
> This patch supports the managed option in a network xml for network devices.
> This option is used for pci network devices when forward mode=hostdev.
>
> Hence the example network xml would be:
>
> <network>
>   <name>direct-network</name>
>   <uuid>81ff0d90-c91e-6742-64da-4a736edb9a8f</uuid>
>   <forward mode="hostdev">
>     <pf dev="eth2" managed='yes'/>
>   </forward>
> </network>
>
> OR
>
> <network>
>   <name>direct-network</name>
>   <uuid>81ff0d90-c91e-6742-64da-4a736edb9a8f</uuid>
>   <forward mode="hostdev">
>     <interface dev="0000:04:00.1" managed='yes'/>
>     <interface dev="0000:04:00.2" managed='yes'/>
>     <interface dev="0000:04:00.3" managed='yes'/>
>   </forward>
> </network>

This functionality should be included with the initial patch rather than
as a later add-on.

>
> Signed-off-by: Shradha Shah <sshah at solarflare.com>
> ---
>  src/conf/network_conf.c     |   61 ++++++++++++++++++++++++++++++++++++++++--
>  src/conf/network_conf.h     |    2 +
>  src/network/bridge_driver.c |    5 +++-
>  3 files changed, 64 insertions(+), 4 deletions(-)
>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index 6b346c3..18e4ee3 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -986,6 +986,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>      char *forwardDev = NULL;
>      xmlNodePtr save = ctxt->node;
>      xmlNodePtr bandwidthNode = NULL;
> +    char *managed = NULL;
>  
>      if (VIR_ALLOC(def) < 0) {
>          virReportOOMError();
> @@ -1128,6 +1129,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>          }
>  
>          forwardDev = virXPathString("string(./@dev)", ctxt);
> +        managed = virXPathString("string(./managed)", ctxt); 
>  
>          /* all of these modes can use a pool of physical interfaces */
>          nForwardIfs = virXPathNodeSet("./interface", ctxt, &forwardIfNodes);
> @@ -1151,6 +1153,12 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>                  goto error;
>              }
>  
> +            if (managed) {
> +                virNetworkReportError(VIR_ERR_XML_ERROR,
> +                                      _("A managed field should not be used in this location when using a SRIOV PF"));
> +                goto error;
> +            }
> +
>              forwardDev = virXMLPropString(*forwardPfNodes, "dev");
>              if (!forwardDev) {
>                  virNetworkReportError(VIR_ERR_XML_ERROR,
> @@ -1159,9 +1167,16 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>                  goto error;
>              }
>  
> +            managed = virXMLPropString(*forwardPfNodes, "managed");
> +            if(managed != NULL) {
> +                if (STREQ(managed, "yes"))
> +                    def->forwardPfs->managed = 1; 
> +            }
> +
>              def->forwardPfs->usageCount = 0;
>              def->forwardPfs->dev = forwardDev;
>              forwardDev = NULL;
> +            managed = NULL;
>              def->nForwardPfs++;
>          } else if (nForwardPfs > 1) {
>              virNetworkReportError(VIR_ERR_XML_ERROR,
> @@ -1170,6 +1185,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>          }
>          if (nForwardIfs > 0 || forwardDev) {
>              int ii;
> +            unsigned int managedvalue = 0;
>  
>              /* allocate array to hold all the portgroups */
>              if (VIR_ALLOC_N(def->forwardIfs, MAX(nForwardIfs, 1)) < 0) {
> @@ -1181,12 +1197,24 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>                  def->forwardIfs[0].usageCount = 0;
>                  def->forwardIfs[0].dev = forwardDev;
>                  forwardDev = NULL;
> +                if (managed != NULL) {
> +                    if (STREQ(managed, "yes"))
> +                        def->forwardIfs[0].managed = 1;
> +                }
> +                managed = NULL;
>                  def->nForwardIfs++;
>              }
>  
>              /* parse each forwardIf */
>              for (ii = 0; ii < nForwardIfs; ii++) {
>                  forwardDev = virXMLPropString(forwardIfNodes[ii], "dev");
> +                managed = virXMLPropString(forwardIfNodes[ii], "managed");
> +                if (managed != NULL) {
> +                    if (STREQ(managed, "yes"))
> +                        managedvalue = 1;
> +                    else
> +                        managedvalue = 0;
> +                }
>                  if (!forwardDev) {
>                      virNetworkReportError(VIR_ERR_XML_ERROR,
>                                            _("Missing required dev attribute in network '%s' forward interface element"),
> @@ -1204,12 +1232,22 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>                                                forwardDev, def->name);
>                          goto error;
>                      }
> +                    
> +                    if (managedvalue != def->forwardIfs[0].managed) {
> +                        virNetworkReportError(VIR_ERR_XML_ERROR,
> +                                              _("managed field of forward dev must match that of the first interface element dev in network '%s'"),
> +                                              def->name);
> +                        goto error;
> +                    }
> +                    VIR_FREE(managed);
>                      VIR_FREE(forwardDev);
>                      continue;
>                  }
>  
>                  def->forwardIfs[ii].dev = forwardDev;
> +                def->forwardIfs[ii].managed = managedvalue;
>                  forwardDev = NULL;
> +                managed = NULL;
>                  def->forwardIfs[ii].usageCount = 0;
>                  def->nForwardIfs++;
>              }
> @@ -1224,6 +1262,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>          }
>          
>          VIR_FREE(forwardDev);
> +        VIR_FREE(managed);
>          VIR_FREE(forwardPfNodes);
>          VIR_FREE(forwardIfNodes);
>  
> @@ -1541,15 +1580,31 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
>                            (def->nForwardIfs || def->nForwardPfs) ? "" : "/");
>  
>          /* For now, hard-coded to at most 1 forwardPfs */
> -        if (def->nForwardPfs)
> -            virBufferEscapeString(&buf, "    <pf dev='%s'/>\n",
> +        if (def->nForwardPfs) {
> +            virBufferEscapeString(&buf, "    <pf dev='%s'",
>                                    def->forwardPfs[0].dev);
>  
> +            if (def->forwardType == VIR_NETWORK_FORWARD_HOSTDEV) {
> +                if (def->forwardPfs[0].managed == 1)
> +                    virBufferAddLit(&buf, " managed='yes'");
> +                else
> +                    virBufferAddLit(&buf, " managed='no'");
> +            }
> +            virBufferAddLit(&buf, "/>\n");
> +        }
> +        
>          if (def->nForwardIfs &&
>              (!def->nForwardPfs || !(flags & VIR_NETWORK_XML_INACTIVE))) {
>              for (ii = 0; ii < def->nForwardIfs; ii++) {
> -                virBufferEscapeString(&buf, "    <interface dev='%s'/>\n",
> +                virBufferEscapeString(&buf, "    <interface dev='%s'",
>                                        def->forwardIfs[ii].dev);
> +                if (def->forwardType == VIR_NETWORK_FORWARD_HOSTDEV) {
> +                    if (def->forwardIfs[ii].managed == 1)
> +                        virBufferAddLit(&buf, " managed='yes'");
> +                    else
> +                        virBufferAddLit(&buf, " managed='no'");
> +                }
> +                virBufferAddLit(&buf, "/>\n");
>              }
>          }
>          if (def->nForwardPfs || def->nForwardIfs)
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index d473c71..4276934 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -135,6 +135,7 @@ struct _virNetworkForwardIfDef {
>      char *dev;      /* name of device */
>      int usageCount; /* how many guest interfaces are bound to this device? */
>      bool isPciAddr; /* Differentiate a VF based on interface name or pci addr*/
> +    unsigned int managed:1;
>  };
>  
>  typedef struct _virNetworkForwardPfDef virNetworkForwardPfDef;
> @@ -142,6 +143,7 @@ typedef virNetworkForwardPfDef *virNetworkForwardPfDefPtr;
>  struct _virNetworkForwardPfDef {
>      char *dev;      /* name of device */ 
>      int usageCount; /* how many guest interfaces are bound to this device? */
> +    unsigned int managed:1;
>  };
>  
>  typedef struct _virPortGroupDef virPortGroupDef;
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index 691ab07..a2293e6 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -2807,6 +2807,9 @@ networkCreateInterfacePool(virNetworkDefPtr netdef) {
>              netdef->forwardIfs[ii].isPciAddr = true;
>          else 
>              netdef->forwardIfs[ii].isPciAddr = false;
> +
> +        if (netdef->forwardPfs[0].managed == 1)
> +            netdef->forwardIfs[ii].managed = 1;
>      }
>      
>      ret = 0;
> @@ -2942,7 +2945,7 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
>          iface->data.network.actual->data.hostdev.def.parent.data.net = iface;
>          iface->data.network.actual->data.hostdev.def.info = &iface->info;
>          iface->data.network.actual->data.hostdev.def.mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
> -        iface->data.network.actual->data.hostdev.def.managed = 1;
> +        iface->data.network.actual->data.hostdev.def.managed = dev->managed;
>          iface->data.network.actual->data.hostdev.def.source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
>          
>          if (dev->isPciAddr == true) {




More information about the libvir-list mailing list