[libvirt] [PATCH v14 44/49] add 3 wrapper functions for prepare/reattach/update domain hostdevs

Chunyan Liu cyliu at suse.com
Fri Mar 7 10:53:11 UTC 2014


Signed-off-by: Chunyan Liu <cyliu at suse.com>
---
 src/libvirt_private.syms |   4 ++
 src/util/virhostdev.c    | 103 +++++++++++++++++++++++++++++++++++++++++++++++
 src/util/virhostdev.h    |  20 +++++++++
 3 files changed, 127 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index e7d9d56..4b42cbb 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1297,15 +1297,19 @@ virHostdevManagerGetDefault;
 virHostdevPciNodeDeviceDetach;
 virHostdevPciNodeDeviceReAttach;
 virHostdevPciNodeDeviceReset;
+virHostdevPrepareDomainHostdevs;
 virHostdevPreparePciHostdevs;
 virHostdevPrepareScsiHostdevs;
 virHostdevPrepareUsbHostdevs;
+virHostdevReAttachDomainHostdevs;
 virHostdevReAttachPciHostdevs;
 virHostdevReAttachScsiHostdevs;
 virHostdevReAttachUsbHostdevs;
 virHostdevUpdateActivePciHostdevs;
 virHostdevUpdateActiveScsiHostdevs;
 virHostdevUpdateActiveUsbHostdevs;
+virHostdevUpdateDomainActiveHostdevs;
+
 
 # util/viridentity.h
 virIdentityGetAttr;
diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
index 5fddd8a..577de48 100644
--- a/src/util/virhostdev.c
+++ b/src/util/virhostdev.c
@@ -1471,3 +1471,106 @@ out:
     virObjectUnlock(hostdev_mgr->activePciHostdevs);
     return ret;
 }
+
+int
+virHostdevPrepareDomainHostdevs(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 (virHostdevPreparePciHostdevs(mgr, driver,
+                                         def->name, def->uuid,
+                                         def->hostdevs,
+                                         def->nhostdevs,
+                                         flags) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_USB) {
+        if (virHostdevPrepareUsbHostdevs(mgr, driver, def->name,
+                                         def->hostdevs, def->nhostdevs,
+                                         flags) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_SCSI) {
+        if (virHostdevPrepareScsiHostdevs(mgr, driver, def->name,
+                                          def->hostdevs, def->nhostdevs) < 0)
+        return -1;
+    }
+
+    return 0;
+}
+
+/* @oldStateDir
+ * For upgrade purpose: see virHostdevReAttachPciHostdevs
+ */
+void
+virHostdevReAttachDomainHostdevs(virHostdevManagerPtr mgr,
+                                 const char *driver,
+                                 virDomainDefPtr def,
+                                 unsigned int flags,
+                                 char *oldStateDir)
+{
+    if (!def->nhostdevs || !mgr)
+        return;
+
+    if (flags & VIR_HOSTDEV_SP_PCI) {
+        virHostdevReAttachPciHostdevs(mgr, driver, def->name,
+                                      def->hostdevs, def->nhostdevs,
+                                      oldStateDir);
+    }
+
+    if (flags & VIR_HOSTDEV_SP_USB) {
+        virHostdevReAttachUsbHostdevs(mgr, driver, def->name,
+                                      def->hostdevs, def->nhostdevs);
+    }
+
+    if (flags & VIR_HOSTDEV_SP_SCSI) {
+        virHostdevReAttachScsiHostdevs(mgr, driver, def->name,
+                                       def->hostdevs, def->nhostdevs);
+    }
+}
+
+int
+virHostdevUpdateDomainActiveHostdevs(virHostdevManagerPtr mgr,
+                                     const char *driver,
+                                     virDomainDefPtr def,
+                                     unsigned int flags)
+{
+    if (!def->nhostdevs)
+        return 0;
+
+    if (flags & VIR_HOSTDEV_SP_PCI) {
+        if (virHostdevUpdateActivePciHostdevs(mgr,
+                                              def->hostdevs,
+                                              def->nhostdevs,
+                                              driver, def->name) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_USB) {
+        if (virHostdevUpdateActiveUsbHostdevs(mgr,
+                                              def->hostdevs,
+                                              def->nhostdevs,
+                                              driver, def->name) < 0)
+            return -1;
+    }
+
+    if (flags & VIR_HOSTDEV_SP_SCSI) {
+        if (virHostdevUpdateActiveScsiHostdevs(mgr,
+                                               def->hostdevs,
+                                               def->nhostdevs,
+                                               driver, def->name) < 0)
+            return -1;
+    }
+
+    return 0;
+}
diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h
index 8680e5d..820b408 100644
--- a/src/util/virhostdev.h
+++ b/src/util/virhostdev.h
@@ -35,6 +35,10 @@
 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 @@ virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr,
                                    int nhostdevs,
                                    const char *drv_name,
                                    const char *dom_name);
+int
+virHostdevUpdateDomainActiveHostdevs(virHostdevManagerPtr mgr,
+                                     const char *driver,
+                                     virDomainDefPtr def,
+                                     unsigned int flags);
+int
+virHostdevPrepareDomainHostdevs(virHostdevManagerPtr mgr,
+                                const char *driver,
+                                virDomainDefPtr def,
+                                unsigned int flags);
+void
+virHostdevReAttachDomainHostdevs(virHostdevManagerPtr mgr,
+                                 const char *driver,
+                                 virDomainDefPtr def,
+                                 unsigned int flags,
+                                 char *oldStateDir);
 
 /* functions used by NodeDevDetach/Reattach/Reset */
 int virHostdevPciNodeDeviceDetach(virHostdevManagerPtr mgr,
-- 
1.9.0




More information about the libvir-list mailing list