]> xenbits.xensource.com Git - libvirt.git/commitdiff
add 3 wrapper functions for prepare/reattach/update domain hostdevs
authorChunyan Liu <cyliu@suse.com>
Thu, 6 Mar 2014 07:57:03 +0000 (15:57 +0800)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 12 Mar 2014 16:53:20 +0000 (16:53 +0000)
src/libvirt_private.syms
src/util/virhostdev.c
src/util/virhostdev.h

index 7af0864b8199668c1476fa5fc27929a07306667c..aaaac2f73bccfb5ff9d545c98f594c9ca46d04ce 100644 (file)
@@ -1297,20 +1297,24 @@ virHookInitialize;
 virHookPresent;
 
 
-#util/virhostdev.h
+# util/virhostdev.h
 virHostdevManagerGetDefault;
 virHostdevPCINodeDeviceDetach;
 virHostdevPCINodeDeviceReAttach;
 virHostdevPCINodeDeviceReset;
+virHostdevPrepareDomainDevices;
 virHostdevPreparePCIDevices;
 virHostdevPrepareSCSIDevices;
 virHostdevPrepareUSBDevices;
+virHostdevReAttachDomainDevices;
 virHostdevReAttachPCIDevices;
 virHostdevReAttachSCSIDevices;
 virHostdevReAttachUSBDevices;
 virHostdevUpdateActivePCIDevices;
 virHostdevUpdateActiveSCSIDevices;
 virHostdevUpdateActiveUSBDevices;
+virHostdevUpdateDomainActiveDevices;
+
 
 # util/viridentity.h
 virIdentityGetAttr;
index 1cfba82ffc1911bc61e21a4a43eb5230cda14572..a2cb0006f757cdbf26d65fb7fc2aceac6941d80b 100644 (file)
@@ -1468,3 +1468,106 @@ out:
     virObjectUnlock(hostdev_mgr->activePCIHostdevs);
     return ret;
 }
+
+int
+virHostdevPrepareDomainDevices(virHostdevManagerPtr mgr,
+                               const char *driver,
+                               virDomainDefPtr def,
+                               unsigned int flags)
+{
+    if (!def->nhostdevs)
+        return 0;
+
+    if (mgr == NULL)
+        return -1;
+
+    if (flags & VIR_HOSTDEV_SP_PCI) {
+        if (virHostdevPreparePCIDevices(mgr, driver,
+                                        def->name, def->uuid,
+                                        def->hostdevs,
+                                        def->nhostdevs,
+                                        flags) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_USB) {
+        if (virHostdevPrepareUSBDevices(mgr, driver, def->name,
+                                         def->hostdevs, def->nhostdevs,
+                                         flags) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_SCSI) {
+        if (virHostdevPrepareSCSIDevices(mgr, driver, def->name,
+                                         def->hostdevs, def->nhostdevs) < 0)
+        return -1;
+    }
+
+    return 0;
+}
+
+/* @oldStateDir
+ * For upgrade purpose: see virHostdevReAttachPciHostdevs
+ */
+void
+virHostdevReAttachDomainDevices(virHostdevManagerPtr mgr,
+                                const char *driver,
+                                virDomainDefPtr def,
+                                unsigned int flags,
+                                const char *oldStateDir)
+{
+    if (!def->nhostdevs || !mgr)
+        return;
+
+    if (flags & VIR_HOSTDEV_SP_PCI) {
+        virHostdevReAttachPCIDevices(mgr, driver, def->name,
+                                     def->hostdevs, def->nhostdevs,
+                                     oldStateDir);
+    }
+
+    if (flags & VIR_HOSTDEV_SP_USB) {
+        virHostdevReAttachUSBDevices(mgr, driver, def->name,
+                                     def->hostdevs, def->nhostdevs);
+    }
+
+    if (flags & VIR_HOSTDEV_SP_SCSI) {
+        virHostdevReAttachSCSIDevices(mgr, driver, def->name,
+                                      def->hostdevs, def->nhostdevs);
+    }
+}
+
+int
+virHostdevUpdateDomainActiveDevices(virHostdevManagerPtr mgr,
+                                    const char *driver,
+                                    virDomainDefPtr def,
+                                    unsigned int flags)
+{
+    if (!def->nhostdevs)
+        return 0;
+
+    if (flags & VIR_HOSTDEV_SP_PCI) {
+        if (virHostdevUpdateActivePCIDevices(mgr,
+                                             def->hostdevs,
+                                             def->nhostdevs,
+                                             driver, def->name) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_USB) {
+        if (virHostdevUpdateActiveUSBDevices(mgr,
+                                             def->hostdevs,
+                                             def->nhostdevs,
+                                             driver, def->name) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_SCSI) {
+        if (virHostdevUpdateActiveSCSIDevices(mgr,
+                                              def->hostdevs,
+                                              def->nhostdevs,
+                                              driver, def->name) < 0)
+            return -1;
+    }
+
+    return 0;
+}
index f2ba0effc3409e4fb5c99552c1e4089396942eca..da1367c4c1e2acf1357702b378dd7a938a869646 100644 (file)
 typedef enum {
     VIR_HOSTDEV_STRICT_ACS_CHECK     = (1 << 0), /* strict acs check */
     VIR_HOSTDEV_COLD_BOOT            = (1 << 1), /* cold boot */
+
+    VIR_HOSTDEV_SP_PCI               = (1 << 8), /* support pci passthrough */
+    VIR_HOSTDEV_SP_USB               = (1 << 9), /* support usb passthrough */
+    VIR_HOSTDEV_SP_SCSI              = (1 << 10), /* support scsi passthrough */
 } virHostdevFlag;
 
 
@@ -108,6 +112,22 @@ virHostdevUpdateActiveSCSIDevices(virHostdevManagerPtr mgr,
                                   int nhostdevs,
                                   const char *drv_name,
                                   const char *dom_name);
+int
+virHostdevUpdateDomainActiveDevices(virHostdevManagerPtr mgr,
+                                    const char *driver,
+                                    virDomainDefPtr def,
+                                    unsigned int flags);
+int
+virHostdevPrepareDomainDevices(virHostdevManagerPtr mgr,
+                               const char *driver,
+                               virDomainDefPtr def,
+                               unsigned int flags);
+void
+virHostdevReAttachDomainDevices(virHostdevManagerPtr mgr,
+                                const char *driver,
+                                virDomainDefPtr def,
+                                unsigned int flags,
+                                const char *oldStateDir);
 
 /* functions used by NodeDevDetach/Reattach/Reset */
 int virHostdevPCINodeDeviceDetach(virHostdevManagerPtr mgr,