]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: implement vsock hotunplug
authorJán Tomko <jtomko@redhat.com>
Wed, 30 May 2018 10:49:04 +0000 (12:49 +0200)
committerJán Tomko <jtomko@redhat.com>
Tue, 5 Jun 2018 05:51:18 +0000 (07:51 +0200)
https://bugzilla.redhat.com/show_bug.cgi?id=1291851

Signed-off-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_hotplug.c
src/qemu/qemu_hotplug.h

index fa94ae9e3897ef8359610e9d8ef3d32d7d61f0ab..e030a9e095bfeb5fcb0f6809885fe13a9470164c 100644 (file)
@@ -7799,6 +7799,10 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
         ret = qemuDomainDetachRedirdevDevice(driver, vm, dev->data.redirdev, async);
         break;
 
+    case VIR_DOMAIN_DEVICE_VSOCK:
+        ret = qemuDomainDetachVsockDevice(vm, dev->data.vsock, async);
+        break;
+
     case VIR_DOMAIN_DEVICE_FS:
     case VIR_DOMAIN_DEVICE_SOUND:
     case VIR_DOMAIN_DEVICE_VIDEO:
@@ -7811,7 +7815,6 @@ qemuDomainDetachDeviceLive(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 detach of device '%s' is not supported"),
index 7cfdc4207a1d998aa092d55ba29f9184b3505a60..08e68939cdc924e12f2bd849946aee73b1147df0 100644 (file)
@@ -4596,6 +4596,26 @@ qemuDomainRemoveInputDevice(virDomainObjPtr vm,
 }
 
 
+static int
+qemuDomainRemoveVsockDevice(virDomainObjPtr vm,
+                            virDomainVsockDefPtr dev)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virQEMUDriverPtr driver = priv->driver;
+    virObjectEventPtr event = NULL;
+
+    VIR_DEBUG("Removing vsock device %s from domain %p %s",
+              dev->info.alias, vm, vm->def->name);
+
+    event = virDomainEventDeviceRemovedNewFromObj(vm, dev->info.alias);
+    qemuDomainEventQueue(driver, event);
+    qemuDomainReleaseDeviceAddress(vm, &dev->info, NULL);
+    virDomainVsockDefFree(vm->def->vsock);
+    vm->def->vsock = NULL;
+    return 0;
+}
+
+
 static int
 qemuDomainRemoveRedirdevDevice(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
@@ -4690,6 +4710,10 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver,
         ret = qemuDomainRemoveWatchdog(driver, vm, dev->data.watchdog);
         break;
 
+    case VIR_DOMAIN_DEVICE_VSOCK:
+        ret = qemuDomainRemoveVsockDevice(vm, dev->data.vsock);
+        break;
+
     case VIR_DOMAIN_DEVICE_NONE:
     case VIR_DOMAIN_DEVICE_LEASE:
     case VIR_DOMAIN_DEVICE_FS:
@@ -4703,7 +4727,6 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver,
     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,
                        _("don't know how to remove a %s device"),
@@ -6592,3 +6615,46 @@ qemuDomainDetachInputDevice(virDomainObjPtr vm,
         qemuDomainResetDeviceRemoval(vm);
     return ret;
 }
+
+
+int
+qemuDomainDetachVsockDevice(virDomainObjPtr vm,
+                            virDomainVsockDefPtr dev,
+                            bool async)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virQEMUDriverPtr driver = priv->driver;
+    virDomainVsockDefPtr vsock = vm->def->vsock;
+    int ret = -1;
+
+
+    if (!vsock ||
+        !virDomainVsockDefEquals(dev, vsock)) {
+        virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                       _("matching vsock device not found"));
+        return -1;
+    }
+
+    if (!async)
+        qemuDomainMarkDeviceForRemoval(vm, &vsock->info);
+
+    qemuDomainObjEnterMonitor(driver, vm);
+    if (qemuMonitorDelDevice(priv->mon, vsock->info.alias)) {
+        ignore_value(qemuDomainObjExitMonitor(driver, vm));
+        goto cleanup;
+    }
+    if (qemuDomainObjExitMonitor(driver, vm) < 0)
+        goto cleanup;
+
+    if (async) {
+        ret = 0;
+    } else {
+        if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+            ret = qemuDomainRemoveVsockDevice(vm, vsock);
+    }
+
+ cleanup:
+    if (!async)
+        qemuDomainResetDeviceRemoval(vm);
+    return ret;
+}
index ab298382eb9dbe9047edc5ac3ec1dc834c71b20e..0bcccee8fcab055af74e9f6494887a17337f6fba 100644 (file)
@@ -201,4 +201,7 @@ int qemuDomainDetachInputDevice(virDomainObjPtr vm,
                                 virDomainInputDefPtr def,
                                 bool async);
 
+int qemuDomainDetachVsockDevice(virDomainObjPtr vm,
+                                virDomainVsockDefPtr dev,
+                                bool async);
 #endif /* __QEMU_HOTPLUG_H__ */