]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: allow cold unplugging of input devices
authorJán Tomko <jtomko@redhat.com>
Tue, 3 Oct 2017 14:25:13 +0000 (16:25 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 19 Oct 2017 12:42:10 +0000 (14:42 +0200)
https://bugzilla.redhat.com/show_bug.cgi?id=1379603

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_driver.c

index 5d95c5bdb0a5e735346e6126cddbcbc79bad5cb8..b85d3f5a6ed23694137f4dc3553f338e1c14f124 100644 (file)
@@ -16612,6 +16612,43 @@ virDomainShmemDefRemove(virDomainDefPtr def,
 }
 
 
+static bool
+virDomainInputDefEquals(const virDomainInputDef *a,
+                        const virDomainInputDef *b)
+{
+    if (a->type != b->type)
+        return false;
+
+    if (a->bus != b->bus)
+        return false;
+
+    if (a->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH &&
+        STRNEQ_NULLABLE(a->source.evdev, b->source.evdev))
+        return false;
+
+    if (a->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
+        !virDomainDeviceInfoAddressIsEqual(&a->info, &b->info))
+        return false;
+
+    return true;
+}
+
+
+ssize_t
+virDomainInputDefFind(const virDomainDef *def,
+                      const virDomainInputDef *input)
+{
+    size_t i;
+
+    for (i = 0; i < def->ninputs; i++) {
+        if (virDomainInputDefEquals(input, def->inputs[i]))
+            return i;
+    }
+
+    return -1;
+}
+
+
 char *
 virDomainDefGetDefaultEmulator(virDomainDefPtr def,
                                virCapsPtr caps)
index 354b7adfa557fcc6f3ff932f28263ca092b46b30..f251f390b7a00d673f68ed92f54c17bba1a34919 100644 (file)
@@ -3184,6 +3184,9 @@ ssize_t virDomainShmemDefFind(virDomainDefPtr def, virDomainShmemDefPtr shmem)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 virDomainShmemDefPtr virDomainShmemDefRemove(virDomainDefPtr def, size_t idx)
     ATTRIBUTE_NONNULL(1);
+ssize_t virDomainInputDefFind(const virDomainDef *def,
+                              const virDomainInputDef *input)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 
 VIR_ENUM_DECL(virDomainTaint)
 VIR_ENUM_DECL(virDomainVirt)
index 10c6aeadcdcf113ca21537d7008dc5d4302b0a6f..3246cfbba1462222dcda1ee4372aa39952138803 100644 (file)
@@ -386,6 +386,7 @@ virDomainHubTypeFromString;
 virDomainHubTypeToString;
 virDomainHypervTypeFromString;
 virDomainHypervTypeToString;
+virDomainInputDefFind;
 virDomainInputDefFree;
 virDomainIOMMUModelTypeFromString;
 virDomainIOMMUModelTypeToString;
index 1d1f4af49a0de9d73cf59d6244a3a5654d4c9e6f..a9724f009835b6a273bc350ae108f9f7e18e9aa5 100644 (file)
@@ -8239,6 +8239,14 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef,
         break;
 
     case VIR_DOMAIN_DEVICE_INPUT:
+        if ((idx = virDomainInputDefFind(vmdef, dev->data.input)) < 0) {
+            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                           _("matching input device not found"));
+            return -1;
+        }
+        VIR_DELETE_ELEMENT(vmdef->inputs, idx, vmdef->ninputs);
+        break;
+
     case VIR_DOMAIN_DEVICE_SOUND:
     case VIR_DOMAIN_DEVICE_VIDEO:
     case VIR_DOMAIN_DEVICE_GRAPHICS: