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

Jim Fehlig jfehlig at suse.com
Thu Mar 10 00:08:47 UTC 2016


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!

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