]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: alias: Fix calculation of memory device aliases
authorPeter Krempa <pkrempa@redhat.com>
Wed, 6 Apr 2016 15:32:12 +0000 (17:32 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 7 Apr 2016 07:54:40 +0000 (09:54 +0200)
For device hotplug, the new alias ID needs to be checked in the list
rather than using the count of devices. Unplugging a device that is not
last in the array will make further hotplug impossible due to alias
collision.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1324551

src/qemu/qemu_alias.c
src/qemu/qemu_alias.h
src/qemu/qemu_hotplug.c

index 330a391de4151bd2d8a8e738fc3421d4a25e3c8f..ade2033e273c8386b0a12e41716462ac0cb5a9a4 100644 (file)
@@ -401,6 +401,26 @@ qemuAssignDeviceRNGAlias(virDomainDefPtr def,
 }
 
 
+int
+qemuAssignDeviceMemoryAlias(virDomainDefPtr def,
+                            virDomainMemoryDefPtr mem)
+{
+    size_t i;
+    int maxidx = 0;
+    int idx;
+
+    for (i = 0; i < def->nmems; i++) {
+        if ((idx = qemuDomainDeviceAliasIndex(&def->mems[i]->info, "dimm")) >= maxidx)
+            maxidx = idx + 1;
+    }
+
+    if (virAsprintf(&mem->info.alias, "dimm%d", maxidx) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 int
 qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
 {
index f09466d77ebf891d1f09925261b2488522c1df40..2d7bc9b376c50652d5a304d116ffd58698f5ec8c 100644 (file)
@@ -57,6 +57,9 @@ int qemuAssignDeviceRedirdevAlias(virDomainDefPtr def,
 int qemuAssignDeviceRNGAlias(virDomainDefPtr def,
                              virDomainRNGDefPtr rng);
 
+int qemuAssignDeviceMemoryAlias(virDomainDefPtr def,
+                                virDomainMemoryDefPtr mems);
+
 int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps);
 
 int qemuDomainDeviceAliasIndex(const virDomainDeviceInfo *info,
index b9a8b51594633f0b29a2df55e06dd410774d7198..bd1a128090bfb981e040f149b59c225f056be6b1 100644 (file)
@@ -1751,7 +1751,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
     if (qemuDomainDefValidateMemoryHotplug(vm->def, priv->qemuCaps, mem) < 0)
         goto cleanup;
 
-    if (virAsprintf(&mem->info.alias, "dimm%zu", vm->def->nmems) < 0)
+    if (qemuAssignDeviceMemoryAlias(vm->def, mem) < 0)
         goto cleanup;
 
     if (virAsprintf(&objalias, "mem%s", mem->info.alias) < 0)