From d3fba07bc09993638aac3550263b43d65510a19f Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 6 Apr 2016 17:32:12 +0200 Subject: [PATCH] qemu: alias: Fix calculation of memory device aliases 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 | 20 ++++++++++++++++++++ src/qemu/qemu_alias.h | 3 +++ src/qemu/qemu_hotplug.c | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 010d6b9845..d56a5a12d9 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -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) { diff --git a/src/qemu/qemu_alias.h b/src/qemu/qemu_alias.h index b915f73576..7b49324095 100644 --- a/src/qemu/qemu_alias.h +++ b/src/qemu/qemu_alias.h @@ -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, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 48bea6ace6..67fb6240e6 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -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) -- 2.47.2