]> git.ipfire.org Git - thirdparty/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)
committerCole Robinson <crobinso@redhat.com>
Wed, 20 Apr 2016 13:10:30 +0000 (09:10 -0400)
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
(cherry picked from commit be6e92f541ab27019de530f1f08ec9b2912765a9)

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

index 010d6b9845cd0adbd9ea43a49668f56759a971ed..d56a5a12d902b5202bd6b391df3594cc63f8bebe 100644 (file)
@@ -392,6 +392,26 @@ qemuAssignDeviceRNGAlias(virDomainRNGDefPtr rng,
 }
 
 
+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 b915f73576470155223e6bfee109aa12606fa3b1..7b49324095de46ee16f24f72199028a36a987542 100644 (file)
@@ -57,6 +57,9 @@ int qemuAssignDeviceRedirdevAlias(virDomainDefPtr def,
 int qemuAssignDeviceRNGAlias(virDomainRNGDefPtr rng,
                              size_t idx);
 
+int qemuAssignDeviceMemoryAlias(virDomainDefPtr def,
+                                virDomainMemoryDefPtr mems);
+
 int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps);
 
 int qemuDomainDeviceAliasIndex(const virDomainDeviceInfo *info,
index 48bea6ace6d32fdafc8b0fede813a12bd4994d73..67fb6240e6de18690b83942b8d55f07c15566009 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)