[libvirt] [PATCH 5/8] qemu: implement vsock hotplug

Ján Tomko jtomko at redhat.com
Tue Jun 5 05:47:27 UTC 2018


On Wed, May 30, 2018 at 04:57:54PM +0200, Ján Tomko wrote:
>Allow hotplugging the vsock device.
>
>https://bugzilla.redhat.com/show_bug.cgi?id=1291851
>
>Signed-off-by: Ján Tomko <jtomko at redhat.com>
>---
> src/qemu/qemu_driver.c  |  9 ++++++-
> src/qemu/qemu_hotplug.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_hotplug.h |  4 +++
> 3 files changed, 82 insertions(+), 1 deletion(-)
>
>diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>index 3aa694de12..fa94ae9e38 100644
>--- a/src/qemu/qemu_driver.c
>+++ b/src/qemu/qemu_driver.c
>@@ -7690,6 +7690,14 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
>         }
>         break;
>
>+    case VIR_DOMAIN_DEVICE_VSOCK:
>+        ret = qemuDomainAttachVsockDevice(driver, vm, dev->data.vsock);
>+        if (ret == 0) {
>+            alias = dev->data.vsock->info.alias;
>+            dev->data.vsock = NULL;
>+        }
>+        break;
>+
>     case VIR_DOMAIN_DEVICE_NONE:
>     case VIR_DOMAIN_DEVICE_FS:
>     case VIR_DOMAIN_DEVICE_SOUND:
>@@ -7702,7 +7710,6 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
>     case VIR_DOMAIN_DEVICE_TPM:
>     case VIR_DOMAIN_DEVICE_PANIC:
>     case VIR_DOMAIN_DEVICE_IOMMU:
>-    case VIR_DOMAIN_DEVICE_VSOCK:
>     case VIR_DOMAIN_DEVICE_LAST:
>         virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
>                        _("live attach of device '%s' is not supported"),
>diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>index b4bbe62c75..ada120bcfe 100644
>--- a/src/qemu/qemu_hotplug.c
>+++ b/src/qemu/qemu_hotplug.c
>@@ -3015,6 +3015,76 @@ qemuDomainAttachInputDevice(virQEMUDriverPtr driver,
> }
>
>
>+int
>+qemuDomainAttachVsockDevice(virQEMUDriverPtr driver,
>+                            virDomainObjPtr vm,
>+                            virDomainVsockDefPtr vsock)
>+{
>+    qemuDomainVsockPrivatePtr vsockPriv = (qemuDomainVsockPrivatePtr)vsock->privateData;
>+    qemuDomainObjPrivatePtr priv = vm->privateData;
>+    virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_VSOCK,
>+                               { .vsock = vsock } };
>+    virErrorPtr originalError = NULL;
>+    const char *fdprefix = "vsockfd";
>+    bool releaseaddr = false;
>+    char *fdname = NULL;
>+    char *devstr = NULL;
>+    int ret = -1;
>+
>+    if (vm->def->vsock) {
>+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
>+                       _("the domain already has a vsock device"));
>+        return -1;
>+    }
>+
>+    if (qemuDomainEnsureVirtioAddress(&releaseaddr, vm, &dev, "vsock") < 0)
>+        return -1;
>+
>+    if (qemuAssignDeviceVsockAlias(vsock) < 0)
>+        goto cleanup;
>+
>+    if (qemuProcessOpenVhostVsock(vsock) < 0)
>+        goto cleanup;
>+
>+    if (virAsprintf(&fdname, "%s%u", fdprefix, vsockPriv->vhostfd) < 0)
>+        goto cleanup;
>+
>+    if (!(devstr = qemuBuildVsockDevStr(vm->def, vsock, priv->qemuCaps, fdprefix)))
>+        goto cleanup;
>+
>+    qemuDomainObjEnterMonitor(driver, vm);
>+    if (qemuMonitorAddDeviceWithFd(priv->mon, devstr, vsockPriv->vhostfd, fdname) < 0)
>+        goto exit_monitor;
>+
>+    if (qemuDomainObjExitMonitor(driver, vm) < 0) {
>+        releaseaddr = false;
>+        goto cleanup;
>+    }
>+
>+    VIR_STEAL_PTR(vm->def->vsock, vsock);
>+
>+    ret = 0;
>+
>+ cleanup:
>+    if (ret < 0) {
>+        virErrorPreserveLast(&originalError);
>+        if (releaseaddr)
>+            qemuDomainReleaseDeviceAddress(vm, &vsock->info, NULL);
>+        virErrorRestore(&originalError);
>+    }
>+
>+    virDomainVsockDefFree(vsock);

This free is bogus - on success we consume the pointer and on failure
the caller frees the device.

I'll remove it before pushing.

Jano

>+    VIR_FREE(devstr);
>+    VIR_FREE(fdname);
>+    return ret;
>+
-------------- 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/20180605/4f2a0a8b/attachment-0001.sig>


More information about the libvir-list mailing list