[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