]> xenbits.xensource.com Git - libvirt.git/commitdiff
libxl: support creating domain with VF assignment from a pool
authorChunyan Liu <cyliu@suse.com>
Thu, 7 Apr 2016 10:09:19 +0000 (18:09 +0800)
committerJim Fehlig <jfehlig@suse.com>
Thu, 14 Apr 2016 00:35:29 +0000 (18:35 -0600)
Add codes to support creating domain with network defition of assigning
SRIOV VF from a pool.

Signed-off-by: Chunyan Liu <cyliu@suse.com>
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
src/libxl/libxl_domain.c
tests/Makefile.am

index aed904b7917ac0cda84396436a65ab88d7d6bbdc..86fb7132bed9e7207a23dd0f39a39cb0c160ac0f 100644 (file)
@@ -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);
         }
     }
 
@@ -900,6 +905,46 @@ libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config)
     return -1;
 }
 
+static int
+libxlNetworkPrepareDevices(virDomainDefPtr def)
+{
+    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)
+            return -1;
+
+        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)
+                return -1;
+        }
+    }
+    return 0;
+}
+
 static void
 libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback)
 {
@@ -1050,6 +1095,9 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
         goto cleanup;
     VIR_FREE(priv->lockState);
 
+    if (libxlNetworkPrepareDevices(vm->def) < 0)
+        goto cleanup_dom;
+
     if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def,
                                cfg->ctx, &d_config) < 0)
         goto cleanup_dom;
index b3f1144266907361e2fd4524482e5847cd7c7c84..db4f88b883cf3f8d618d4b273321a05aa34fe2a6 100644 (file)
@@ -534,6 +534,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 = \