[libvirt] [PATCH V4 4/6] libxl: support creating domain with VF assignment from a pool

Chun Yan Liu cyliu at suse.com
Tue Mar 29 01:31:03 UTC 2016



>>> On 3/29/2016 at 08:05 AM, in message <56F9C6D0.5000702 at suse.com>, Jim Fehlig
<jfehlig at suse.com> wrote: 
> On 03/21/2016 02:11 AM, Chunyan Liu wrote: 
> > Add codes to support creating domain with network defition of assigning 
> > SRIOV VF from a pool. 
> > 
> > Signed-off-by: Chunyan Liu <cyliu at suse.com> 
> > --- 
> >  src/libxl/libxl_domain.c | 50  
> ++++++++++++++++++++++++++++++++++++++++++++++++ 
> >  tests/Makefile.am        |  3 +++ 
> >  2 files changed, 53 insertions(+) 
> > 
> > diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c 
> > index c8d09b1..d11bf3a 100644 
> > --- a/src/libxl/libxl_domain.c 
> > +++ b/src/libxl/libxl_domain.c 
> > @@ -36,6 +36,7 @@ 
> >  #include "virtime.h" 
> >  #include "locking/domain_lock.h" 
> >  #include "xen_common.h" 
> > +#include "network/bridge_driver.h" 
> >   
> >  #define VIR_FROM_THIS VIR_FROM_LIBXL 
> >   
> > @@ -764,6 +765,10 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver, 
> >              if (net->ifname && 
> >                  STRPREFIX(net->ifname, LIBXL_GENERATED_PREFIX_XEN)) 
> >                  VIR_FREE(net->ifname); 
> > + 
> > +            /* cleanup actual device */ 
> > +            virDomainNetRemoveHostdev(vm->def, net); 
> > +            networkReleaseActualDevice(vm->def, net); 
> >          } 
> >      } 
> >   
> > @@ -960,6 +965,48 @@ libxlDomainCreateIfaceNames(virDomainDefPtr def,  
> libxl_domain_config *d_config) 
> >      } 
> >  } 
> >   
> > +static int 
> > +libxlNetworkPrepareDevices(virDomainDefPtr def) 
> > +{ 
> > +    int ret = -1; 
> > +    size_t i; 
> > + 
> > +    for (i = 0; i < def->nnets; i++) { 
> > +        virDomainNetDefPtr net = def->nets[i]; 
> > +        int actualType; 
> > + 
> > +        /* If appropriate, grab a physical device from the configured 
> > +         * network's pool of devices, or resolve bridge device name 
> > +         * to the one defined in the network definition. 
> > +         */ 
> > +        if (networkAllocateActualDevice(def, net) < 0) 
> > +            goto cleanup; 
> > + 
> > +        actualType = virDomainNetGetActualType(net); 
> > +        if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV && 
> > +            net->type == VIR_DOMAIN_NET_TYPE_NETWORK) { 
> > +            /* Each type='hostdev' network device must also have a 
> > +             * corresponding entry in the hostdevs array. For netdevs 
> > +             * that are hardcoded as type='hostdev', this is already 
> > +             * done by the parser, but for those allocated from a 
> > +             * network / determined at runtime, we need to do it 
> > +             * separately. 
> > +             */ 
> > +            virDomainHostdevDefPtr hostdev =  
> virDomainNetGetActualHostdev(net); 
> > +            virDomainHostdevSubsysPCIPtr pcisrc =  
> &hostdev->source.subsys.u.pci; 
> > + 
> > +            if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && 
> > +                hostdev->source.subsys.type ==  
> VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) 
> > +                pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; 
> > + 
> > +            if (virDomainHostdevInsert(def, hostdev) < 0) 
> > +                goto cleanup; 
> > +        } 
> > +    } 
> > +    ret = 0; 
> > + cleanup: 
> > +    return ret; 
>  
> Nothing to cleanup here. I think we should just return -1 on failure paths  
> and 0 
> on success. 
>  
> > +} 
> >   
> >  /* 
> >   * Start a domain through libxenlight. 
> > @@ -1036,6 +1083,9 @@ libxlDomainStart(libxlDriverPrivatePtr driver,  
> virDomainObjPtr vm, 
> >                                      vm, true) < 0) 
> >          goto cleanup; 
> >   
> > +    if (libxlNetworkPrepareDevices(vm->def) < 0) 
> > +        goto cleanup; 
>  
> I accessed a machine to test this series and have found a few problems. 
>  
> 1. When attaching an SR-IOV vf from a pool, the attach appears successful. 
>    I see that xen's pciback driver is bound to the device in the host. I 
>    didn't see the device in the guest (could be a guest problem), nor in 
>    dumpxml or /var/run/libvirt/libxl/<dom-name>.xml. Not surprisingly, 
>    this causes problems with device-detach 
>  
>    # virsh detach-device dom sriov-pool-vif.xml 
>    error: Failed to detach device from sriov-pool-vif.xml 
>    error: operation failed: no device matching mac address 00:16:3e:7a:35:df  
> found 
>  
> 2. After starting a domain containing an interface from sr-iov vf pool, the 
>    interface xml is changed from type='network' to type='hostdev'. E.g. 
>    before creating domain 
>  
>     <interface type='network'> 
>       <source network='passthrough'/> 
>       <mac address='00:16:3e:7a:35:df'/> 
>     </interface> 
>  
>    after creating domain 
>  
>     <interface type='hostdev' managed='yes'> 
>       <mac address='00:16:3e:7a:35:df'/> 
>       <driver name='xen'/> 
>       <source> 
>         <address type='pci' domain='0x0000' bus='0x0a' slot='0x11'  
> function='0x1'/> 
>       </source> 
>     </interface> 
>  
>    Maybe this is intended behavior, but it seems odd. 
>  
> 3. I started a domain containing an interface from sr-iov vf pool. Looks 
>    good. I then tried 'virsh detach-device ...', which never returned 
>    until keepalive timeout. The device was removed from the guest, but 
>    libvirtd got hung up in the process. Oddly, I wasn't able to interrupt 
>    libvirtd with gdb to see what its threads were doing. 
>  
> Do you have access to an appropriate machine to test these scenarios, to see  
> if 
> the issues are reproducible or just a problem with my configuration? 

Yes. We have one machine in our lab. Let me reserve it and check again.

Thanks,
Chunyan

>  
> Regards, 
> Jim 
>  





More information about the libvir-list mailing list