
On 01/05/2018 05:40 AM, Ján Tomko wrote:
On Fri, Dec 22, 2017 at 04:04:03PM +0800, Chen Hanxiao wrote:
From: Chen Hanxiao <chenhanxiao@gmail.com>
We lacked of hot unplugging redirdev device. This patch add support for it. We could use detach-device --live now.
Signed-off-by: Chen Hanxiao <chenhanxiao@gmail.com> --- v3: use helper qemuDomainDelChardevTLSObjects address John's comments
v2: rebase on master
src/qemu/qemu_driver.c | 4 ++- src/qemu/qemu_hotplug.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_hotplug.h | 4 +++ 3 files changed, 98 insertions(+), 1 deletion(-)
[...]
+int +qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainRedirdevDefPtr dev) +{ + int ret = -1; + qemuDomainObjPrivatePtr priv = vm->privateData; + virDomainRedirdevDefPtr tmpRedirdevDef; + ssize_t idx; + + if ((idx = virDomainRedirdevDefFind(vm->def, dev)) < 0) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("no matching redirdev was not found")); + return -1; + } + + tmpRedirdevDef = vm->def->redirdevs[idx]; + + if (!tmpRedirdevDef->info.alias) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("alias not set for redirdev device")); + return -1; + } + + qemuDomainMarkDeviceForRemoval(vm, &tmpRedirdevDef->info); + + qemuDomainObjEnterMonitor(driver, vm); + if (qemuMonitorDelDevice(priv->mon, tmpRedirdevDef->info.alias) < 0) { + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + goto cleanup; + } + if (qemuDomainObjExitMonitor(driver, vm) < 0) + goto cleanup; + + if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1) + ret = qemuDomainRemoveRedirdevDevice(driver, vm, tmpRedirdevDef);
If qemuDomainWaitForDeviceRemoval returns 0 (QEMU supports DEVICE_DEL_EVENT and did not unplug the device in 5 seconds), then libvirtd should remove the device asynchronnously, when the device deletion event arrives.
qemuDomainRemoveRedirdevDevice needs to be also called from qemuDomainRemoveDevice for that to happen.
Jan
oh yeah - right, adding : + case VIR_DOMAIN_DEVICE_REDIRDEV: + ret = qemuDomainRemoveRedirdevDevice(driver, vm, dev->data.redirdev); + break; + to qemuDomainRemoveDevice Tks - John
+ + cleanup: + qemuDomainResetDeviceRemoval(vm); + return ret; +} + + int qemuDomainDetachNetDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 3e0d618e0..9a0c057f1 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -126,6 +126,10 @@ int qemuDomainDetachWatchdog(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainWatchdogDefPtr watchdog);
+int qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainRedirdevDefPtr dev); + int qemuDomainAttachInputDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainInputDefPtr input); -- 2.14.3
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list