[libvirt] [PATCH v3 1/2] qemu: Add support for hot unplugging redirdev device which can use the detach-device --live

Ján Tomko jtomko at redhat.com
Fri Jan 5 10:40:04 UTC 2018


On Fri, Dec 22, 2017 at 04:04:03PM +0800, Chen Hanxiao wrote:
>From: Chen Hanxiao <chenhanxiao at 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 at 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 at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180105/4a28c77f/attachment-0001.sig>


More information about the libvir-list mailing list