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(-)
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, &dev->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, &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);
+
+ 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
On 12/22/2017 03:04 AM, 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.
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 <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(-)
>
[...]
> 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, &dev->info, NULL);
> + virDomainRedirdevDefFree(dev);
> +
> + ret = 0;
> +
> + cleanup:
> + VIR_FREE(charAlias);
> + return ret;
> +}
> +
> +
[...]
Reviewed-by: John Ferlan <jferlan@redhat.com>
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
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(-)
>
>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, &dev->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, &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
>+
>+ 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
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
>
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
在 2018-01-05 21:16:20,"John Ferlan" <jferlan@redhat.com> 写道: > > >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> >>> [...] >>> + 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
© 2016 - 2026 Red Hat, Inc.