[libvirt] [PATCH v2] qemu: Add support for hot unplug redirdev device

Chen Hanxiao posted 1 patch 6 years, 4 months ago
docs/news.xml           |   9 ++++
src/qemu/qemu_driver.c  |   4 +-
src/qemu/qemu_hotplug.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_hotplug.h |   3 ++
4 files changed, 126 insertions(+), 1 deletion(-)
[libvirt] [PATCH v2] qemu: Add support for hot unplug redirdev device
Posted by Chen Hanxiao 6 years, 4 months ago
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>
---
v2: add news section

 docs/news.xml           |   9 ++++
 src/qemu/qemu_driver.c  |   4 +-
 src/qemu/qemu_hotplug.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_hotplug.h |   3 ++
 4 files changed, 126 insertions(+), 1 deletion(-)

diff --git a/docs/news.xml b/docs/news.xml
index 0ec9857e2..ec32dc850 100644
--- a/docs/news.xml
+++ b/docs/news.xml
@@ -35,6 +35,15 @@
 <libvirt>
   <release version="v4.0.0" date="unreleased">
     <section title="New features">
+      <change>
+        <summary>
+          qemu: Add support for hot unplug redirdev device
+        </summary>
+        <description>
+          We've supported hotplug redirdev device, but lacked of
+          hot unplug feature. Now we can do it by libvirt.
+        </description>
+      </change>
     </section>
     <section title="Improvements">
     </section>
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index aa30b119a..180bd0ebf 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 24631cb8f..d97aa6051 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -4375,6 +4375,74 @@ qemuDomainRemoveInputDevice(virDomainObjPtr vm,
     return 0;
 }
 
+static int
+qemuDomainRemoveRedirdevDevice(virQEMUDriverPtr driver,
+                               virDomainObjPtr vm,
+                               virDomainRedirdevDefPtr redirdev)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+    virObjectEventPtr event;
+    char *charAlias = NULL;
+    char *tlsAlias = NULL;
+    char *secAlias = NULL;
+    ssize_t idx;
+    int ret = -1;
+
+    VIR_DEBUG("Removing redirdev device %s from domain %p %s",
+              redirdev->info.alias, vm, vm->def->name);
+
+    if (!(charAlias = qemuAliasChardevFromDevAlias(redirdev->info.alias)))
+        goto cleanup;
+
+    if (redirdev->source->type == VIR_DOMAIN_CHR_TYPE_TCP &&
+        redirdev->source->data.tcp.haveTLS == VIR_TRISTATE_BOOL_YES) {
+
+        if (!(tlsAlias = qemuAliasTLSObjFromSrcAlias(charAlias)))
+            goto cleanup;
+
+        /* Best shot at this as the secinfo is destroyed after process launch
+         * and this path does not recreate it. Thus, if the config has the
+         * secret UUID and we have a serial TCP chardev, then formulate a
+         * secAlias which we'll attempt to destroy. */
+        if (cfg->chardevTLSx509secretUUID &&
+            !(secAlias = qemuDomainGetSecretAESAlias(charAlias, false)))
+            goto cleanup;
+    }
+
+    qemuDomainObjEnterMonitor(driver, vm);
+    /* Usually device_del will remove related chardev as well,
+     * So we don't need to check its return value.
+     */
+    ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
+
+    if (tlsAlias)
+        ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias));
+    if (secAlias)
+        ignore_value(qemuMonitorDelObject(priv->mon, secAlias));
+
+    if (qemuDomainObjExitMonitor(driver, vm) < 0)
+        goto cleanup;
+
+    virDomainAuditRedirdev(vm, redirdev, "detach", true);
+
+    event = virDomainEventDeviceRemovedNewFromObj(vm, redirdev->info.alias);
+    qemuDomainEventQueue(driver, event);
+
+    if ((idx = virDomainRedirdevDefFind(vm->def, redirdev)) >= 0)
+        virDomainRedirdevDefRemove(vm->def, idx);
+    qemuDomainReleaseDeviceAddress(vm, &redirdev->info, NULL);
+    virDomainRedirdevDefFree(redirdev);
+
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(charAlias);
+    VIR_FREE(tlsAlias);
+    VIR_FREE(secAlias);
+    return ret;
+}
+
 
 int
 qemuDomainRemoveDevice(virQEMUDriverPtr driver,
@@ -5112,6 +5180,49 @@ qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
     return ret;
 }
 
+int
+qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver,
+                                   virDomainObjPtr vm,
+                                   virDomainRedirdevDefPtr redirdev)
+{
+    int ret = -1;
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virDomainDefPtr vmdef = vm->def;
+    virDomainRedirdevDefPtr tmpRedirdevDef;
+    ssize_t idx;
+
+    if ((idx = virDomainRedirdevDefFind(vmdef, redirdev)) < 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,
diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
index 3e0d618e0..6c642c4fd 100644
--- a/src/qemu/qemu_hotplug.h
+++ b/src/qemu/qemu_hotplug.h
@@ -125,6 +125,9 @@ int qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
 int qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virDomainWatchdogDefPtr watchdog);
+int qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver,
+                                   virDomainObjPtr vm,
+                                   virDomainRedirdevDefPtr redirdev);
 
 int qemuDomainAttachInputDevice(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
-- 
2.14.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2] qemu: Add support for hot unplug redirdev device
Posted by Peter Krempa 6 years, 4 months ago
On Thu, Dec 07, 2017 at 09:26:12 +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>
> ---
> v2: add news section
> 
>  docs/news.xml           |   9 ++++
>  src/qemu/qemu_driver.c  |   4 +-
>  src/qemu/qemu_hotplug.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_hotplug.h |   3 ++
>  4 files changed, 126 insertions(+), 1 deletion(-)
> 
> diff --git a/docs/news.xml b/docs/news.xml
> index 0ec9857e2..ec32dc850 100644
> --- a/docs/news.xml
> +++ b/docs/news.xml
> @@ -35,6 +35,15 @@
>  <libvirt>
>    <release version="v4.0.0" date="unreleased">
>      <section title="New features">
> +      <change>
> +        <summary>
> +          qemu: Add support for hot unplug redirdev device
> +        </summary>
> +        <description>
> +          We've supported hotplug redirdev device, but lacked of
> +          hot unplug feature. Now we can do it by libvirt.
> +        </description>
> +      </change>
>      </section>
>      <section title="Improvements">
>      </section>

News section should be in a separate patch.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2] qemu: Add support for hot unplug redirdev device
Posted by Chen Hanxiao 6 years, 4 months ago

At 2017-12-07 17:35:42, "Peter Krempa" <pkrempa@redhat.com> wrote:
>On Thu, Dec 07, 2017 at 09:26:12 +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>
>> ---
>> v2: add news section
>> 
>>  docs/news.xml           |   9 ++++
>>  src/qemu/qemu_driver.c  |   4 +-
>>  src/qemu/qemu_hotplug.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++
>>  src/qemu/qemu_hotplug.h |   3 ++
>>  4 files changed, 126 insertions(+), 1 deletion(-)
>> 
>> diff --git a/docs/news.xml b/docs/news.xml
>> index 0ec9857e2..ec32dc850 100644
>> --- a/docs/news.xml
>> +++ b/docs/news.xml
>> @@ -35,6 +35,15 @@
>>  <libvirt>
>>    <release version="v4.0.0" date="unreleased">
>>      <section title="New features">
>> +      <change>
>> +        <summary>
>> +          qemu: Add support for hot unplug redirdev device
>> +        </summary>
>> +        <description>
>> +          We've supported hotplug redirdev device, but lacked of
>> +          hot unplug feature. Now we can do it by libvirt.
>> +        </description>
>> +      </change>
>>      </section>
>>      <section title="Improvements">
>>      </section>
>
>News section should be in a separate patch.

Thanks, will be changed in the next patchset.

Regards,
- Chen

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list