[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