[libvirt] [PATCH V2] libxl: support assignment from a pool of SRIOV VFs

Chun Yan Liu cyliu at suse.com
Thu Mar 10 02:51:38 UTC 2016



>>> On 3/10/2016 at 08:08 AM, in message <56E0BB0F.3000705 at suse.com>, Jim Fehlig
<jfehlig at suse.com> wrote: 
> Hi Chunyan, 
>  
> Sorry for the long delay... 
>  
> On 02/23/2016 01:07 AM, Chunyan Liu wrote: 
> > Add codes to support creating domain with network defition of assigning 
> > SRIOV VF from a pool. And fix hot plug and unplug SRIOV VF under this 
> > kind of network defition. 
> > 
> > Signed-off-by: Chunyan Liu <cyliu at suse.com> 
> > --- 
> > Changes: 
> > * move bug fix to another patch 
> > * use virDomainNetGetActualType instead of multiple times checking 
> > --- 
> >  src/libxl/libxl_conf.c   |  3 ++- 
> >  src/libxl/libxl_domain.c | 46  
> ++++++++++++++++++++++++++++++++++++++++++++++ 
> >  src/libxl/libxl_driver.c | 12 ++++++++++++ 
> >  tests/Makefile.am        |  3 +++ 
> >  4 files changed, 63 insertions(+), 1 deletion(-) 
> > 
> > diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c 
> > index 48b8826..3cefbaa 100644 
> > --- a/src/libxl/libxl_conf.c 
> > +++ b/src/libxl/libxl_conf.c 
> > @@ -1453,7 +1453,8 @@ libxlMakeNicList(virDomainDefPtr def,   
> libxl_domain_config *d_config) 
> >          return -1; 
> >   
> >      for (i = 0; i < nnics; i++) { 
> > -        if (l_nics[i]->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) 
> > +        if (virDomainNetGetActualType(l_nics[i]) 
> > +            == VIR_DOMAIN_NET_TYPE_HOSTDEV) 
>  
> AFAICT this change is unrelated to the patch subject and should be done in a 
> separate patch. Also the patch no longer applies cleanly. Can you drop this 
> hunk, rebase, and send a V3? Thanks! 

Updated. V3 is posted.

Thanks,
Chunyan

>  
> Regards, 
> Jim 
>  
> >              continue; 
> >   
> >          if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics])) 
> > diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c 
> > index 50f7eed..88d1399 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 
> >   
> > @@ -929,6 +930,48 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev,  
> void *for_callback) 
> >      libxl_event_free(ctx, ev); 
> >  } 
> >   
> > +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; 
> > +} 
> >   
> >  /* 
> >   * Start a domain through libxenlight. 
> > @@ -1005,6 +1048,9 @@ libxlDomainStart(libxlDriverPrivatePtr driver,  
> virDomainObjPtr vm, 
> >                                      vm, true) < 0) 
> >          goto cleanup; 
> >   
> > +    if (libxlNetworkPrepareDevices(vm->def) < 0) 
> > +        goto cleanup; 
> > + 
> >      if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def, 
> >                                 cfg->ctx, &d_config) < 0) 
> >          goto cleanup; 
> > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c 
> > index 404016e..eef6651 100644 
> > --- a/src/libxl/libxl_driver.c 
> > +++ b/src/libxl/libxl_driver.c 
> > @@ -3049,6 +3049,12 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr  
> driver, 
> >   
> >      libxl_device_pci_init(&pcidev); 
> >   
> > +    /* For those allocated from a network pool/ determined at runtime,  
> it's 
> > +     * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to 
> > +     * set backend correctly. 
> > +     */ 
> > +    pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; 
> > + 
> >      if (virDomainHostdevFind(vm->def, hostdev, &found) >= 0) { 
> >          virReportError(VIR_ERR_OPERATION_FAILED, 
> >                         _("target pci device %.4x:%.2x:%.2x.%.1x already  
> exists"), 
> > @@ -3390,6 +3396,12 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr  
> driver, 
> >   
> >      libxl_device_pci_init(&pcidev); 
> >   
> > +    /* For those allocated from a network pool/ determined at runtime,  
> it's 
> > +     * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to 
> > +     * set backend correctly. 
> > +     */ 
> > +    pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; 
> > + 
> >      idx = virDomainHostdevFind(vm->def, hostdev, &detach); 
> >      if (idx < 0) { 
> >          virReportError(VIR_ERR_OPERATION_FAILED, 
> > diff --git a/tests/Makefile.am b/tests/Makefile.am 
> > index 90981dc..b08cc7a 100644 
> > --- a/tests/Makefile.am 
> > +++ b/tests/Makefile.am 
> > @@ -530,6 +530,9 @@ endif ! WITH_XEN 
> >   
> >  if WITH_LIBXL 
> >  libxl_LDADDS = ../src/libvirt_driver_libxl_impl.la 
> > +if WITH_NETWORK 
> > +libxl_LDADDS += ../src/libvirt_driver_network_impl.la 
> > +endif WITH_NETWORK 
> >  libxl_LDADDS += $(LDADDS) 
> >   
> >  xlconfigtest_SOURCES = \ 
>  
>  





More information about the libvir-list mailing list