On 11/03/2016 02:12 AM, Peter Krempa wrote:
The memory device alias needs to be treated as machine ABI as qemu
is
using it in the migration stream for section labels. To simplify this
generate the alias from the slot number unless an existing broken
configuration is detected.
With this patch the aliases are predictable and even certain
configurations which would not be migratable previously are fixed.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1359135
---
src/qemu/qemu_alias.c | 27 ++++++++++++++++++----
src/qemu/qemu_alias.h | 3 ++-
src/qemu/qemu_hotplug.c | 4 +++-
.../qemuxml2argv-memory-hotplug-dimm-addr.args | 4 ++--
4 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
index 9737158..8521a44 100644
--- a/src/qemu/qemu_alias.c
+++ b/src/qemu/qemu_alias.c
@@ -332,17 +332,34 @@ qemuAssignDeviceRNGAlias(virDomainDefPtr def,
}
+/**
+ * qemuAssignDeviceMemoryAlias:
+ * @def: domain definition. Necessary only if @oldAlias is true.
+ * @mem: memory device definition
+ * @oldAlias: Generate the alias according to the order of the device in @def
+ * rather than according to the slot number for legacy reasons.
+ *
+ * Generates alias for a memory device according to slot number if @oldAlias is
+ * false or according to order in @def->mems otherwise.
+ *
+ * Returns 0 on success, -1 on error.
+ */
int
qemuAssignDeviceMemoryAlias(virDomainDefPtr def,
- virDomainMemoryDefPtr mem)
+ virDomainMemoryDefPtr mem,
+ bool oldAlias)
Whether the oldAlias is necessary depends on patch 2 feedback...
{
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;
This has assumed that info.alias is defined - perhaps not necessarily
true after libvirtd restart... Luckily we haven't had any issues yet.
At the very least it would be obvious as I would think qemu would fail
the attach reqeust due to duplicate ID.
+ if (oldAlias) {
+ for (i = 0; i < def->nmems; i++) {
+ if ((idx = qemuDomainDeviceAliasIndex(&def->mems[i]->info,
"dimm")) >= maxidx)
+ maxidx = idx + 1;
+ }
+ } else {
+ maxidx = mem->info.addr.dimm.slot;
}
if (virAsprintf(&mem->info.alias, "dimm%d", maxidx) < 0)
@@ -475,7 +492,7 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr
qemuCaps)
return -1;
}
for (i = 0; i < def->nmems; i++) {
- if (virAsprintf(&def->mems[i]->info.alias, "dimm%zu", i)
< 0)
+ if (qemuAssignDeviceMemoryAlias(NULL, def->mems[i], false) < 0)
And this is probably our root cause... It also makes the assumption
that whatever <address> is there is numerically ordered with dimm.slot,
although as your XML from patch1 proves we can have slot='0' and slot='2'
At least it's "consistent" (partially) to the theory of ordering mems
and assigning aliases in increasing order
return -1;
}
diff --git a/src/qemu/qemu_alias.h b/src/qemu/qemu_alias.h
index d298a4d..1d93912 100644
--- a/src/qemu/qemu_alias.h
+++ b/src/qemu/qemu_alias.h
@@ -58,7 +58,8 @@ int qemuAssignDeviceRNGAlias(virDomainDefPtr def,
virDomainRNGDefPtr rng);
int qemuAssignDeviceMemoryAlias(virDomainDefPtr def,
- virDomainMemoryDefPtr mems);
+ virDomainMemoryDefPtr mems,
+ bool ble);
'ble' - cut-n-paste? or some other name used during development?
Let's see how the fallout of patch2 goes and then think about this.
John
int qemuAssignDeviceShmemAlias(virDomainDefPtr def,
virDomainShmemDefPtr shmem,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 75477cd..77176fb 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2130,7 +2130,9 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
if (qemuDomainAssignMemoryDeviceSlot(vm->def, mem) < 0)
goto cleanup;
- if (qemuAssignDeviceMemoryAlias(vm->def, mem) < 0)
+ /* in cases where we are using a VM with aliases generated according to the
+ * index of the memory device we need to keep continue using that scheme */
+ if (qemuAssignDeviceMemoryAlias(vm->def, mem, priv->memHotplugAliasMismatch)
< 0)
goto cleanup;
if (virAsprintf(&objalias, "mem%s", mem->info.alias) < 0)
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
index 23403df..fdbb4c3 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
@@ -15,8 +15,8 @@ QEMU_AUDIO_DRV=none \
mem-path=/dev/hugepages2M/libvirt/qemu,size=536870912,host-nodes=1-3,\
policy=bind \
-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
--object memory-backend-ram,id=memdimm1,size=536870912 \
--device pc-dimm,node=0,memdev=memdimm1,id=dimm1,slot=2 \
+-object memory-backend-ram,id=memdimm2,size=536870912 \
+-device pc-dimm,node=0,memdev=memdimm2,id=dimm2,slot=2 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-nographic \
-nodefaults \