mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-23 13:05:27 +00:00
qemu: simplify PCI configfd handling in monitor
This is also a bug fix - on the error path, qemu_hotplug would leave the configfd file leaked into qemu. At least the next attempt to hotplug a PCI device would reuse the same fdname, and when the qemu getfd monitor command gets a new fd by the same name as an earlier one, it closes the earlier one, so there is no risk of qemu running out of fds. * src/qemu/qemu_monitor.h (qemuMonitorAddDeviceWithFd): New prototype. * src/qemu/qemu_monitor.c (qemuMonitorAddDevice): Move guts... (qemuMonitorAddDeviceWithFd): ...to new function, and add support for fd passing. * src/qemu/qemu_hotplug.c (qemuDomainAttachHostPciDevice): Use it to simplify code. Suggested by Daniel P. Berrange.
This commit is contained in:
parent
058d4efa58
commit
098312391e
@ -820,14 +820,6 @@ int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
|
||||
virReportOOMError();
|
||||
goto error;
|
||||
}
|
||||
|
||||
qemuDomainObjEnterMonitorWithDriver(driver, vm);
|
||||
if (qemuMonitorSendFileHandle(priv->mon, configfd_name,
|
||||
configfd) < 0) {
|
||||
qemuDomainObjExitMonitorWithDriver(driver, vm);
|
||||
goto error;
|
||||
}
|
||||
qemuDomainObjExitMonitorWithDriver(driver, vm);
|
||||
}
|
||||
}
|
||||
|
||||
@ -842,7 +834,8 @@ int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
|
||||
goto error;
|
||||
|
||||
qemuDomainObjEnterMonitorWithDriver(driver, vm);
|
||||
ret = qemuMonitorAddDevice(priv->mon, devstr);
|
||||
ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr,
|
||||
configfd, configfd_name);
|
||||
qemuDomainObjExitMonitorWithDriver(driver, vm);
|
||||
} else {
|
||||
virDomainDevicePCIAddress guestAddr;
|
||||
|
@ -2030,10 +2030,13 @@ int qemuMonitorDelDevice(qemuMonitorPtr mon,
|
||||
}
|
||||
|
||||
|
||||
int qemuMonitorAddDevice(qemuMonitorPtr mon,
|
||||
const char *devicestr)
|
||||
int qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon,
|
||||
const char *devicestr,
|
||||
int fd,
|
||||
const char *fdname)
|
||||
{
|
||||
VIR_DEBUG("mon=%p device=%s", mon, devicestr);
|
||||
VIR_DEBUG("mon=%p device=%s fd=%d fdname=%s", mon, devicestr, fd,
|
||||
NULLSTR(fdname));
|
||||
int ret;
|
||||
|
||||
if (!mon) {
|
||||
@ -2042,13 +2045,28 @@ int qemuMonitorAddDevice(qemuMonitorPtr mon,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fd >= 0 && qemuMonitorSendFileHandle(mon, fdname, fd) < 0)
|
||||
return -1;
|
||||
|
||||
if (mon->json)
|
||||
ret = qemuMonitorJSONAddDevice(mon, devicestr);
|
||||
else
|
||||
ret = qemuMonitorTextAddDevice(mon, devicestr);
|
||||
|
||||
if (ret < 0 && fd >= 0) {
|
||||
if (qemuMonitorCloseFileHandle(mon, fdname) < 0)
|
||||
VIR_WARN("failed to close device handle '%s'", fdname);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int qemuMonitorAddDevice(qemuMonitorPtr mon,
|
||||
const char *devicestr)
|
||||
{
|
||||
return qemuMonitorAddDeviceWithFd(mon, devicestr, -1, NULL);
|
||||
}
|
||||
|
||||
int qemuMonitorAddDrive(qemuMonitorPtr mon,
|
||||
const char *drivestr)
|
||||
{
|
||||
|
@ -390,6 +390,11 @@ int qemuMonitorGetAllPCIAddresses(qemuMonitorPtr mon,
|
||||
int qemuMonitorAddDevice(qemuMonitorPtr mon,
|
||||
const char *devicestr);
|
||||
|
||||
int qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon,
|
||||
const char *devicestr,
|
||||
int fd,
|
||||
const char *fdname);
|
||||
|
||||
int qemuMonitorDelDevice(qemuMonitorPtr mon,
|
||||
const char *devalias);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user