[libvirt] [PATCH 4/5 v3] Functionality to implicitly get interface pool from SR-IOV PF.

Daniel P. Berrange berrange at redhat.com
Tue Jan 10 11:19:06 UTC 2012


On Wed, Dec 14, 2011 at 10:50:30AM +0000, Shradha Shah wrote:
> If a system has 64 or more VF's, it is quite tedious to mention each VF
> in the interface pool.
> The following modification will implicitly create an interface pool from
> the SR-IOV PF.
> ---
>  src/network/bridge_driver.c |   93 +++++++++++++++++++++++++++++++++---------
>  1 files changed, 73 insertions(+), 20 deletions(-)
> 
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index 63338a2..9ae9c50 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -2817,15 +2817,19 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
>          /* If there is only a single device, just return it (caller will detect
>           * any error if exclusive use is required but could not be acquired).
>           */
> -        if (netdef->nForwardIfs == 0) {
> +        if ((netdef->nForwardIfs <= 0) && (netdef->nForwardPfs <= 0)) { 
>              networkReportError(VIR_ERR_INTERNAL_ERROR,
>                                 _("network '%s' uses a direct mode, but has no forward dev and no interface pool"),
>                                 netdef->name);
>              goto cleanup;
> -        } else {
> +        } 
> +        
> +        else {

Minor style issue - can you keep the '} else {' alignment.

>              int ii;
>              virNetworkForwardIfDefPtr dev = NULL;
> -
> +            unsigned int num_virt_fns = 0;
> +            char **vfname = NULL;
> +            
>              /* pick an interface from the pool */
>  
>              /* PASSTHROUGH mode, and PRIVATE Mode + 802.1Qbh both require
> @@ -2833,20 +2837,67 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
>               * 0.  Other modes can share, so just search for the one with
>               * the lowest usageCount.
>               */
> -            if ((netdef->forwardType == VIR_NETWORK_FORWARD_PASSTHROUGH) ||
> -                ((netdef->forwardType == VIR_NETWORK_FORWARD_PRIVATE) &&
> -                 iface->data.network.actual->data.direct.virtPortProfile &&
> -                 (iface->data.network.actual->data.direct.virtPortProfile->virtPortType
> -                  == VIR_NETDEV_VPORT_PROFILE_8021QBH))) {
> +            if (netdef->forwardType == VIR_NETWORK_FORWARD_PASSTHROUGH) {         
> +                if ((netdef->nForwardPfs > 0) && (netdef->nForwardIfs <= 0)) {
> +                    if ((virNetDevGetVirtualFunctions(netdef->forwardPfs->dev, 
> +                                                      &vfname, &num_virt_fns)) < 0){
> +                        networkReportError(VIR_ERR_INTERNAL_ERROR,
> +                                           _("Could not get Virtual functions on %s"),
> +                                           netdef->forwardPfs->dev);
> +                        goto out;
> +                    }
> +                    
> +                    if (num_virt_fns == 0) {
> +                        networkReportError(VIR_ERR_INTERNAL_ERROR,
> +                                           _("No Vf's present on SRIOV PF %s"),
> +                                           netdef->forwardPfs->dev);
> +                        goto out;
> +                    }
> +                    
> +                    if ((VIR_ALLOC_N(netdef->forwardIfs, num_virt_fns)) < 0) {
> +                        virReportOOMError();
> +                        goto out;
> +                    }
> +                    
> +                    netdef->nForwardIfs = num_virt_fns;
> +                    
> +                    for (ii = 0; ii < netdef->nForwardIfs; ii++) {
> +                        netdef->forwardIfs[ii].dev = strdup(vfname[ii]);

Missing check for OOM here

> +                        netdef->forwardIfs[ii].usageCount = 0;
> +                    }
> +                    
> +                out:
> +                    for (ii = 0; ii < num_virt_fns; ii++) {
> +                        VIR_FREE(vfname[ii]);
> +                    }
> +                    VIR_FREE(vfname);
> +                }
> +                
>                  /* pick first dev with 0 usageCount */
> -
> +                
>                  for (ii = 0; ii < netdef->nForwardIfs; ii++) {
>                      if (netdef->forwardIfs[ii].usageCount == 0) {
>                          dev = &netdef->forwardIfs[ii];
>                          break;
>                      }
>                  }
> -            } else {
> +            }
> +            else if ((netdef->forwardType == VIR_NETWORK_FORWARD_PRIVATE) &&
> +                     iface->data.network.actual->data.direct.virtPortProfile &&
> +                     (iface->data.network.actual->data.direct.virtPortProfile->virtPortType
> +                      == VIR_NETDEV_VPORT_PROFILE_8021QBH)) {

Also  '} else if '

> +                
> +                
> +                /* pick first dev with 0 usageCount */
> +                
> +                for (ii = 0; ii < netdef->nForwardIfs; ii++) {
> +                    if (netdef->forwardIfs[ii].usageCount == 0) {
> +                        dev = &netdef->forwardIfs[ii];
> +                        break;
> +                    }
> +                }
> +            } 
> +            else {

And '} else {'

>                  /* pick least used dev */
>                  dev = &netdef->forwardIfs[0];
>                  for (ii = 1; ii < netdef->nForwardIfs; ii++) {
> @@ -2858,7 +2909,7 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
>              if (!dev) {
>                  networkReportError(VIR_ERR_INTERNAL_ERROR,
>                                     _("network '%s' requires exclusive access to interfaces, but none are available"),
> -                               netdef->name);
> +                                   netdef->name);
>                  goto cleanup;
>              }
>              iface->data.network.actual->data.direct.linkdev = strdup(dev->dev);


>From this point onwards, AFAICT,  none of the patch hunks have
any functional change. They're all just whitespace changes, or
moving variable declarations. So I think the rest of this patch
can just be dropped.

> @@ -2901,6 +2952,7 @@ networkNotifyActualDevice(virDomainNetDefPtr iface)
>      virNetworkObjPtr network;
>      virNetworkDefPtr netdef;
>      const char *actualDev;
> +    virNetworkForwardIfDefPtr dev = NULL;
>      int ret = -1;
>  
>      if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK)
> @@ -2935,12 +2987,12 @@ networkNotifyActualDevice(virDomainNetDefPtr iface)
>                             _("network '%s' uses a direct mode, but has no forward dev and no interface pool"),
>                             netdef->name);
>          goto cleanup;
> -    } else {
> +    } 
> +    else {

Change back to '} else {'

>          int ii;
> -        virNetworkForwardIfDefPtr dev = NULL;
> -
> +        
>          /* find the matching interface in the pool and increment its usageCount */
> -
> +        
>          for (ii = 0; ii < netdef->nForwardIfs; ii++) {
>              if (STREQ(actualDev, netdef->forwardIfs[ii].dev)) {
>                  dev = &netdef->forwardIfs[ii];
> @@ -2954,7 +3006,7 @@ networkNotifyActualDevice(virDomainNetDefPtr iface)
>                                 netdef->name, actualDev);
>              goto cleanup;
>          }
> -
> +        
>          /* PASSTHROUGH mode, and PRIVATE Mode + 802.1Qbh both require
>           * exclusive access to a device, so current usageCount must be
>           * 0 in those cases.
> @@ -3001,6 +3053,7 @@ networkReleaseActualDevice(virDomainNetDefPtr iface)
>      virNetworkObjPtr network = NULL;
>      virNetworkDefPtr netdef;
>      const char *actualDev;
> +    virNetworkForwardIfDefPtr dev = NULL;
>      int ret = -1;
>  
>      if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK)
> @@ -3036,10 +3089,10 @@ networkReleaseActualDevice(virDomainNetDefPtr iface)
>                             _("network '%s' uses a direct mode, but has no forward dev and no interface pool"),
>                             netdef->name);
>          goto cleanup;
> -    } else {
> +    } 
> +    else {

And here

>          int ii;
> -        virNetworkForwardIfDefPtr dev = NULL;
> -
> +    
>          for (ii = 0; ii < netdef->nForwardIfs; ii++) {
>              if (STREQ(actualDev, netdef->forwardIfs[ii].dev)) {
>                  dev = &netdef->forwardIfs[ii];
> @@ -3053,7 +3106,7 @@ networkReleaseActualDevice(virDomainNetDefPtr iface)
>                                 netdef->name, actualDev);
>              goto cleanup;
>          }
> -
> +        
>          dev->usageCount--;
>          VIR_DEBUG("Releasing physical device %s, usageCount %d",
>                    dev->dev, dev->usageCount);

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list