Re: [libvirt] [PATCH v3 1/2] qemu: Add support for hot unplugging redirdev device which can use the detach-device --live
在 2018-01-05 21:16:20,"John Ferlan"写道: > > >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 >>> [...] >>> + 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 > Thanks, will be updated soon. Regards, - Chen -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 1/2] qemu: Add support for hot unplugging redirdev device which can use the detach-device --live
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>> >> 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 >> --- >> 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, >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 > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 1/2] qemu: Add support for hot unplugging redirdev device which can use the detach-device --live
On Fri, Dec 22, 2017 at 04:04:03PM +0800, Chen Hanxiao wrote: From: Chen HanxiaoWe lacked of hot unplugging redirdev device. This patch add support for it. We could use detach-device --live now. Signed-off-by: Chen Hanxiao --- 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(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 97b194b05..a91288d4b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7787,6 +7787,9 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_INPUT: ret = qemuDomainDetachInputDevice(vm, dev->data.input); break; +case VIR_DOMAIN_DEVICE_REDIRDEV: +ret = qemuDomainDetachRedirdevDevice(driver, vm, dev->data.redirdev); +break; case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_SOUND: @@ -7796,7 +7799,6 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_SMARTCARD: case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: -case VIR_DOMAIN_DEVICE_REDIRDEV: case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b79807300..724ee4f3f 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4388,6 +4388,54 @@ qemuDomainRemoveInputDevice(virDomainObjPtr vm, } +static int +qemuDomainRemoveRedirdevDevice(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainRedirdevDefPtr dev) +{ +qemuDomainObjPrivatePtr priv = vm->privateData; +virObjectEventPtr event; +char *charAlias = NULL; +ssize_t idx; +int ret = -1; + +VIR_DEBUG("Removing redirdev device %s from domain %p %s", + dev->info.alias, vm, vm->def->name); + +if (!(charAlias = qemuAliasChardevFromDevAlias(dev->info.alias))) +goto cleanup; + +qemuDomainObjEnterMonitor(driver, vm); +/* DeviceDel from Detach may remove chardev, + * so we cannot rely on return status to delete TLS chardevs. + */ +ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); + +if (qemuDomainObjExitMonitor(driver, vm) < 0) +goto cleanup; + +if (qemuDomainDelChardevTLSObjects(driver, vm, + dev->source, charAlias) < 0) +goto cleanup; + +virDomainAuditRedirdev(vm, dev, "detach", true); + +event = virDomainEventDeviceRemovedNewFromObj(vm, dev->info.alias); +qemuDomainEventQueue(driver, event); + +if ((idx = virDomainRedirdevDefFind(vm->def, dev)) >= 0) +virDomainRedirdevDefRemove(vm->def, idx); +qemuDomainReleaseDeviceAddress(vm, >info, NULL); +virDomainRedirdevDefFree(dev); + +ret = 0; + + cleanup: +VIR_FREE(charAlias); +return ret; +} + + int qemuDomainRemoveDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -5128,6 +5176,49 @@ qemuDomainDetachWatchdog(virQEMUDriverPtr driver, } +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, >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 + + cleanup: +qemuDomainResetDeviceRemoval(vm); +return ret; +} + + int qemuDomainDetachNetDevice(virQEMUDriverPtr driver,
Re: [libvirt] [PATCH v3 1/2] qemu: Add support for hot unplugging redirdev device which can use the detach-device --live
On 12/22/2017 03:04 AM, Chen Hanxiao wrote: > From: Chen Hanxiao> > We lacked of hot unplugging redirdev device. > This patch add support for it. > We could use detach-device --live now. Change the commit message to: Commit id '162efa1a' added support hotplug a redirdev, but did not add the hot unplug. This patch will add that support to allow usage of the detach-device --live on the device. > > Signed-off-by: Chen Hanxiao > --- > 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(-) > [...] > diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c > index b79807300..724ee4f3f 100644 > --- a/src/qemu/qemu_hotplug.c > +++ b/src/qemu/qemu_hotplug.c > @@ -4388,6 +4388,54 @@ qemuDomainRemoveInputDevice(virDomainObjPtr vm, > } > > > +static int > +qemuDomainRemoveRedirdevDevice(virQEMUDriverPtr driver, > + virDomainObjPtr vm, > + virDomainRedirdevDefPtr dev) > +{ > +qemuDomainObjPrivatePtr priv = vm->privateData; > +virObjectEventPtr event; > +char *charAlias = NULL; > +ssize_t idx; > +int ret = -1; > + > +VIR_DEBUG("Removing redirdev device %s from domain %p %s", > + dev->info.alias, vm, vm->def->name); > + > +if (!(charAlias = qemuAliasChardevFromDevAlias(dev->info.alias))) > +goto cleanup; > + > +qemuDomainObjEnterMonitor(driver, vm); > +/* DeviceDel from Detach may remove chardev, > + * so we cannot rely on return status to delete TLS chardevs. > + */ > +ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); > + > +if (qemuDomainObjExitMonitor(driver, vm) < 0) > +goto cleanup; > + > +if (qemuDomainDelChardevTLSObjects(driver, vm, > + dev->source, charAlias) < 0) The above fits on one line. > +goto cleanup; > + > +virDomainAuditRedirdev(vm, dev, "detach", true); > + > +event = virDomainEventDeviceRemovedNewFromObj(vm, dev->info.alias); > +qemuDomainEventQueue(driver, event); > + > +if ((idx = virDomainRedirdevDefFind(vm->def, dev)) >= 0) > +virDomainRedirdevDefRemove(vm->def, idx); > +qemuDomainReleaseDeviceAddress(vm, >info, NULL); > +virDomainRedirdevDefFree(dev); > + > +ret = 0; > + > + cleanup: > +VIR_FREE(charAlias); > +return ret; > +} > + > + [...] Reviewed-by: John Ferlan John But I'll give it a day or so before pushing - just in case there's a straggler comment or two... -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list