On 03/10/2017 09:35 PM, Laine Stump wrote:
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;
+}
+
This is the same code as in virPCIDeviceBindWithDriverOverride(). ACK if
you replace it with call to this function.
Michal