From 251d179bf2c10c7d7fb594c68f1aac56a9b0d932 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Tue, 7 Mar 2017 12:58:15 -0500 Subject: [PATCH] util: new function virPCIDeviceRebind() This function unbinds a device from its driver, then immediately rebinds it to its driver again. The code for this new function is just the 2nd half of virPCIDeviceBindWithDriverOverride(), so that function's 2nd half is replaced with a call to virPCIDeviceRebind(). --- src/libvirt_private.syms | 1 + src/util/virpci.c | 34 ++++++++++++++++++++++++++-------- src/util/virpci.h | 1 + 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d0f4e98dd7..77f03d9667 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2233,6 +2233,7 @@ virPCIDeviceListSteal; virPCIDeviceListStealIndex; virPCIDeviceNew; virPCIDeviceReattach; +virPCIDeviceRebind; virPCIDeviceReset; virPCIDeviceSetManaged; virPCIDeviceSetRemoveSlot; diff --git a/src/util/virpci.c b/src/util/virpci.c index 9878398100..546aeb550e 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. @@ -1130,16 +1155,9 @@ virPCIDeviceBindWithDriverOverride(virPCIDevicePtr dev, goto cleanup; } - if (virPCIDeviceUnbind(dev) < 0) + if (virPCIDeviceRebind(dev) < 0) goto cleanup; - if (virFileWriteStr(PCI_SYSFS "drivers_probe", dev->name, 0) < 0) { - virReportSystemError(errno, - _("Failed to trigger a probe for PCI device '%s'"), - dev->name); - goto cleanup; - } - ret = 0; cleanup: diff --git a/src/util/virpci.h b/src/util/virpci.h index 4be9cc0fb1..8637c2c685 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);