mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 09:17:52 +03:00
pci: Publish some internal code for virpcitest
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
44bfe3574a
commit
124affae84
@ -1585,6 +1585,7 @@ virPCIDeviceCopy;
|
|||||||
virPCIDeviceDetach;
|
virPCIDeviceDetach;
|
||||||
virPCIDeviceFileIterate;
|
virPCIDeviceFileIterate;
|
||||||
virPCIDeviceFree;
|
virPCIDeviceFree;
|
||||||
|
virPCIDeviceGetDriverPathAndName;
|
||||||
virPCIDeviceGetIOMMUGroupDev;
|
virPCIDeviceGetIOMMUGroupDev;
|
||||||
virPCIDeviceGetIOMMUGroupList;
|
virPCIDeviceGetIOMMUGroupList;
|
||||||
virPCIDeviceGetManaged;
|
virPCIDeviceGetManaged;
|
||||||
@ -1616,6 +1617,7 @@ virPCIDeviceSetReprobe;
|
|||||||
virPCIDeviceSetStubDriver;
|
virPCIDeviceSetStubDriver;
|
||||||
virPCIDeviceSetUnbindFromStub;
|
virPCIDeviceSetUnbindFromStub;
|
||||||
virPCIDeviceSetUsedBy;
|
virPCIDeviceSetUsedBy;
|
||||||
|
virPCIDeviceUnbind;
|
||||||
virPCIDeviceWaitForCleanup;
|
virPCIDeviceWaitForCleanup;
|
||||||
virPCIGetNetName;
|
virPCIGetNetName;
|
||||||
virPCIGetPhysicalFunction;
|
virPCIGetPhysicalFunction;
|
||||||
|
@ -225,7 +225,7 @@ virPCIFile(char **buffer, const char *device, const char *file)
|
|||||||
*
|
*
|
||||||
* Return 0 for success, -1 for error.
|
* Return 0 for success, -1 for error.
|
||||||
*/
|
*/
|
||||||
static int
|
int
|
||||||
virPCIDeviceGetDriverPathAndName(virPCIDevicePtr dev, char **path, char **name)
|
virPCIDeviceGetDriverPathAndName(virPCIDevicePtr dev, char **path, char **name)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
@ -1005,6 +1005,44 @@ recheck:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
virPCIDeviceUnbind(virPCIDevicePtr dev, bool reprobe)
|
||||||
|
{
|
||||||
|
char *path = NULL;
|
||||||
|
char *drvpath = NULL;
|
||||||
|
char *driver = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (virPCIDeviceGetDriverPathAndName(dev, &drvpath, &driver) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!driver) {
|
||||||
|
/* The device is not bound to any driver */
|
||||||
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virPCIFile(&path, dev->name, "driver/unbind") < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virFileExists(path)) {
|
||||||
|
if (virFileWriteStr(path, dev->name, 0) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Failed to unbind PCI device '%s' from %s"),
|
||||||
|
dev->name, driver);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
dev->reprobe = reprobe;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(path);
|
||||||
|
VIR_FREE(drvpath);
|
||||||
|
VIR_FREE(driver);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static const char *virPCIKnownStubs[] = {
|
static const char *virPCIKnownStubs[] = {
|
||||||
"pciback", /* used by xen */
|
"pciback", /* used by xen */
|
||||||
"pci-stub", /* used by kvm legacy passthrough */
|
"pci-stub", /* used by kvm legacy passthrough */
|
||||||
@ -1047,18 +1085,8 @@ virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
|
|||||||
if (!isStub)
|
if (!isStub)
|
||||||
goto remove_slot;
|
goto remove_slot;
|
||||||
|
|
||||||
if (virFileExists(drvdir)) {
|
if (virPCIDeviceUnbind(dev, dev->reprobe) < 0)
|
||||||
if (virPCIDriverFile(&path, driver, "unbind") < 0) {
|
goto cleanup;
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virFileWriteStr(path, dev->name, 0) < 0) {
|
|
||||||
virReportSystemError(errno,
|
|
||||||
_("Failed to unbind PCI device '%s' from %s"),
|
|
||||||
dev->name, driver);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dev->unbind_from_stub = false;
|
dev->unbind_from_stub = false;
|
||||||
|
|
||||||
remove_slot:
|
remove_slot:
|
||||||
@ -1174,24 +1202,9 @@ virPCIDeviceBindToStub(virPCIDevicePtr dev,
|
|||||||
goto remove_id;
|
goto remove_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the device is already bound to a driver, unbind it.
|
if (virPCIDeviceUnbind(dev, reprobe) < 0)
|
||||||
* Note, this will have rather unpleasant side effects if this
|
|
||||||
* PCI device happens to be IDE controller for the disk hosting
|
|
||||||
* your root filesystem.
|
|
||||||
*/
|
|
||||||
if (virPCIFile(&path, dev->name, "driver/unbind") < 0)
|
|
||||||
goto remove_id;
|
goto remove_id;
|
||||||
|
|
||||||
if (virFileExists(path)) {
|
|
||||||
if (virFileWriteStr(path, dev->name, 0) < 0) {
|
|
||||||
virReportSystemError(errno,
|
|
||||||
_("Failed to unbind PCI device '%s'"),
|
|
||||||
dev->name);
|
|
||||||
goto remove_id;
|
|
||||||
}
|
|
||||||
dev->reprobe = reprobe;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the device isn't already bound to pci-stub, try binding it now.
|
/* If the device isn't already bound to pci-stub, try binding it now.
|
||||||
*/
|
*/
|
||||||
if (!virFileLinkPointsTo(driverLink, stubDriverPath)) {
|
if (!virFileLinkPointsTo(driverLink, stubDriverPath)) {
|
||||||
|
@ -167,4 +167,9 @@ int virPCIDeviceAddressParse(char *address, virPCIDeviceAddressPtr bdf);
|
|||||||
int virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
|
int virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
|
||||||
char **pfname, int *vf_index);
|
char **pfname, int *vf_index);
|
||||||
|
|
||||||
|
int virPCIDeviceUnbind(virPCIDevicePtr dev, bool reprobe);
|
||||||
|
int virPCIDeviceGetDriverPathAndName(virPCIDevicePtr dev,
|
||||||
|
char **path,
|
||||||
|
char **name);
|
||||||
|
|
||||||
#endif /* __VIR_PCI_H__ */
|
#endif /* __VIR_PCI_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user