提交 00729f45 编写于 作者: C Chunyan Liu 提交者: Daniel P. Berrange

move virHostdevUpdate* functions to virhostdev.c

上级 d44a2047
...@@ -1301,6 +1301,9 @@ virHookPresent; ...@@ -1301,6 +1301,9 @@ virHookPresent;
virHostdevManagerGetDefault; virHostdevManagerGetDefault;
virHostdevPreparePCIDevices; virHostdevPreparePCIDevices;
virHostdevReAttachPCIDevices; virHostdevReAttachPCIDevices;
virHostdevUpdateActivePciHostdevs;
virHostdevUpdateActiveScsiHostdevs;
virHostdevUpdateActiveUsbHostdevs;
# util/viridentity.h # util/viridentity.h
virIdentityGetAttr; virIdentityGetAttr;
......
...@@ -41,65 +41,6 @@ ...@@ -41,65 +41,6 @@
#define VIR_FROM_THIS VIR_FROM_QEMU #define VIR_FROM_THIS VIR_FROM_QEMU
static int
virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def)
{
virDomainHostdevDefPtr hostdev = NULL;
virPCIDevicePtr dev = NULL;
size_t i;
int ret = -1;
virObjectLock(mgr->activePciHostdevs);
virObjectLock(mgr->inactivePciHostdevs);
for (i = 0; i < def->nhostdevs; i++) {
hostdev = def->hostdevs[i];
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
continue;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
continue;
dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.addr.domain,
hostdev->source.subsys.u.pci.addr.bus,
hostdev->source.subsys.u.pci.addr.slot,
hostdev->source.subsys.u.pci.addr.function);
if (!dev)
goto cleanup;
virPCIDeviceSetManaged(dev, hostdev->managed);
if (hostdev->source.subsys.u.pci.backend
== VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
if (virPCIDeviceSetStubDriver(dev, "vfio-pci") < 0)
goto cleanup;
} else {
if (virPCIDeviceSetStubDriver(dev, "pci-stub") < 0)
goto cleanup;
}
virPCIDeviceSetUsedBy(dev, drv_name, def->name);
/* Setup the original states for the PCI device */
virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub);
virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot);
virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe);
if (virPCIDeviceListAdd(mgr->activePciHostdevs, dev) < 0)
goto cleanup;
dev = NULL;
}
ret = 0;
cleanup:
virPCIDeviceFree(dev);
virObjectUnlock(mgr->activePciHostdevs);
virObjectUnlock(mgr->inactivePciHostdevs);
return ret;
}
int int
qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver,
virDomainDefPtr def) virDomainDefPtr def)
...@@ -112,49 +53,6 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, ...@@ -112,49 +53,6 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver,
return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def); return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def);
} }
static int
virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def)
{
virDomainHostdevDefPtr hostdev = NULL;
size_t i;
int ret = -1;
virObjectLock(mgr->activeUsbHostdevs);
for (i = 0; i < def->nhostdevs; i++) {
virUSBDevicePtr usb = NULL;
hostdev = def->hostdevs[i];
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
continue;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
continue;
usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus,
hostdev->source.subsys.u.usb.device,
NULL);
if (!usb) {
VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s",
hostdev->source.subsys.u.usb.bus,
hostdev->source.subsys.u.usb.device,
def->name);
continue;
}
virUSBDeviceSetUsedBy(usb, drv_name, def->name);
if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) {
virUSBDeviceFree(usb);
goto cleanup;
}
}
ret = 0;
cleanup:
virObjectUnlock(mgr->activeUsbHostdevs);
return ret;
}
int int
qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,
virDomainDefPtr def) virDomainDefPtr def)
...@@ -167,55 +65,6 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, ...@@ -167,55 +65,6 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,
return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def); return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def);
} }
static int
virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def)
{
virDomainHostdevDefPtr hostdev = NULL;
size_t i;
int ret = -1;
virSCSIDevicePtr scsi = NULL;
virSCSIDevicePtr tmp = NULL;
virObjectLock(mgr->activeScsiHostdevs);
for (i = 0; i < def->nhostdevs; i++) {
hostdev = def->hostdevs[i];
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI)
continue;
if (!(scsi = virSCSIDeviceNew(NULL,
hostdev->source.subsys.u.scsi.adapter,
hostdev->source.subsys.u.scsi.bus,
hostdev->source.subsys.u.scsi.target,
hostdev->source.subsys.u.scsi.unit,
hostdev->readonly,
hostdev->shareable)))
goto cleanup;
if ((tmp = virSCSIDeviceListFind(mgr->activeScsiHostdevs, scsi))) {
if (virSCSIDeviceSetUsedBy(tmp, drv_name, def->name) < 0) {
virSCSIDeviceFree(scsi);
goto cleanup;
}
virSCSIDeviceFree(scsi);
} else {
if (virSCSIDeviceSetUsedBy(scsi, drv_name, def->name) < 0 ||
virSCSIDeviceListAdd(mgr->activeScsiHostdevs, scsi) < 0) {
virSCSIDeviceFree(scsi);
goto cleanup;
}
}
}
ret = 0;
cleanup:
virObjectUnlock(mgr->activeScsiHostdevs);
return ret;
}
int int
qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver, qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver,
virDomainDefPtr def) virDomainDefPtr def)
......
...@@ -773,3 +773,154 @@ cleanup: ...@@ -773,3 +773,154 @@ cleanup:
virObjectUnlock(hostdev_mgr->activePciHostdevs); virObjectUnlock(hostdev_mgr->activePciHostdevs);
virObjectUnlock(hostdev_mgr->inactivePciHostdevs); virObjectUnlock(hostdev_mgr->inactivePciHostdevs);
} }
int
virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def)
{
virDomainHostdevDefPtr hostdev = NULL;
virPCIDevicePtr dev = NULL;
size_t i;
int ret = -1;
virObjectLock(mgr->activePciHostdevs);
virObjectLock(mgr->inactivePciHostdevs);
for (i = 0; i < def->nhostdevs; i++) {
hostdev = def->hostdevs[i];
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
continue;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
continue;
dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.addr.domain,
hostdev->source.subsys.u.pci.addr.bus,
hostdev->source.subsys.u.pci.addr.slot,
hostdev->source.subsys.u.pci.addr.function);
if (!dev)
goto cleanup;
virPCIDeviceSetManaged(dev, hostdev->managed);
if (hostdev->source.subsys.u.pci.backend
== VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
if (virPCIDeviceSetStubDriver(dev, "vfio-pci") < 0)
goto cleanup;
} else {
if (virPCIDeviceSetStubDriver(dev, "pci-stub") < 0)
goto cleanup;
}
virPCIDeviceSetUsedBy(dev, drv_name, def->name);
/* Setup the original states for the PCI device */
virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub);
virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot);
virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe);
if (virPCIDeviceListAdd(mgr->activePciHostdevs, dev) < 0)
goto cleanup;
dev = NULL;
}
ret = 0;
cleanup:
virPCIDeviceFree(dev);
virObjectUnlock(mgr->activePciHostdevs);
virObjectUnlock(mgr->inactivePciHostdevs);
return ret;
}
int
virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def)
{
virDomainHostdevDefPtr hostdev = NULL;
size_t i;
int ret = -1;
virObjectLock(mgr->activeUsbHostdevs);
for (i = 0; i < def->nhostdevs; i++) {
virUSBDevicePtr usb = NULL;
hostdev = def->hostdevs[i];
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
continue;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
continue;
usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus,
hostdev->source.subsys.u.usb.device,
NULL);
if (!usb) {
VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s",
hostdev->source.subsys.u.usb.bus,
hostdev->source.subsys.u.usb.device,
def->name);
continue;
}
virUSBDeviceSetUsedBy(usb, drv_name, def->name);
if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) {
virUSBDeviceFree(usb);
goto cleanup;
}
}
ret = 0;
cleanup:
virObjectUnlock(mgr->activeUsbHostdevs);
return ret;
}
int
virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def)
{
virDomainHostdevDefPtr hostdev = NULL;
size_t i;
int ret = -1;
virSCSIDevicePtr scsi = NULL;
virSCSIDevicePtr tmp = NULL;
virObjectLock(mgr->activeScsiHostdevs);
for (i = 0; i < def->nhostdevs; i++) {
hostdev = def->hostdevs[i];
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI)
continue;
if (!(scsi = virSCSIDeviceNew(NULL,
hostdev->source.subsys.u.scsi.adapter,
hostdev->source.subsys.u.scsi.bus,
hostdev->source.subsys.u.scsi.target,
hostdev->source.subsys.u.scsi.unit,
hostdev->readonly,
hostdev->shareable)))
goto cleanup;
if ((tmp = virSCSIDeviceListFind(mgr->activeScsiHostdevs, scsi))) {
if (virSCSIDeviceSetUsedBy(tmp, drv_name, def->name) < 0) {
virSCSIDeviceFree(scsi);
goto cleanup;
}
virSCSIDeviceFree(scsi);
} else {
if (virSCSIDeviceSetUsedBy(scsi, drv_name, def->name) < 0 ||
virSCSIDeviceListAdd(mgr->activeScsiHostdevs, scsi) < 0) {
virSCSIDeviceFree(scsi);
goto cleanup;
}
}
}
ret = 0;
cleanup:
virObjectUnlock(mgr->activeScsiHostdevs);
return ret;
}
...@@ -65,5 +65,17 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, ...@@ -65,5 +65,17 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr,
virDomainHostdevDefPtr *hostdevs, virDomainHostdevDefPtr *hostdevs,
int nhostdevs, int nhostdevs,
char *oldStateDir); char *oldStateDir);
int
virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def);
int
virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def);
int
virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr,
const char *drv_name,
virDomainDefPtr def);
#endif /* __VIR_HOSTDEV_H__ */ #endif /* __VIR_HOSTDEV_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册