[libvirt] [PATCH 08/19] util: new function virPCIDeviceRebind()

Laine Stump laine at laine.org
Fri Mar 10 20:35:01 UTC 2017


This function unbinds a device from its driver, then immediately
rebinds it to its driver again.
---
 src/libvirt_private.syms |  1 +
 src/util/virpci.c        | 25 +++++++++++++++++++++++++
 src/util/virpci.h        |  1 +
 3 files changed, 27 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index b44a6ee..ef027cc 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2217,6 +2217,7 @@ virPCIDeviceListSteal;
 virPCIDeviceListStealIndex;
 virPCIDeviceNew;
 virPCIDeviceReattach;
+virPCIDeviceRebind;
 virPCIDeviceReset;
 virPCIDeviceSetManaged;
 virPCIDeviceSetRemoveSlot;
diff --git a/src/util/virpci.c b/src/util/virpci.c
index 9878398..a007eea 100644
--- a/src/util/virpci.c
+++ b/src/util/virpci.c
@@ -1101,6 +1101,31 @@ virPCIDeviceUnbind(virPCIDevicePtr dev)
     return ret;
 }
 
+
+/**
+ * virPCIDeviceRebind:
+ *  @dev: virPCIDevice object describing the device to rebind
+ *
+ * unbind a device from its driver, then immediately rebind it.
+ *
+ * Returns 0 on success, -1 on failure
+ */
+int virPCIDeviceRebind(virPCIDevicePtr dev)
+{
+    if (virPCIDeviceUnbind(dev) < 0)
+        return -1;
+
+    if (virFileWriteStr(PCI_SYSFS "drivers_probe", dev->name, 0) < 0) {
+        virReportSystemError(errno,
+                             _("Failed to trigger a probe for PCI device '%s'"),
+                             dev->name);
+        return -1;
+    }
+
+    return 0;
+}
+
+
 /*
  * Bind a PCI device to a driver using driver_override sysfs interface.
  * E.g.
diff --git a/src/util/virpci.h b/src/util/virpci.h
index 4be9cc0..8637c2c 100644
--- a/src/util/virpci.h
+++ b/src/util/virpci.h
@@ -225,6 +225,7 @@ int virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
                                  char **pfname, int *vf_index);
 
 int virPCIDeviceUnbind(virPCIDevicePtr dev);
+int virPCIDeviceRebind(virPCIDevicePtr dev);
 int virPCIDeviceGetDriverPathAndName(virPCIDevicePtr dev,
                                      char **path,
                                      char **name);
-- 
2.9.3




More information about the libvir-list mailing list