The memory sizes in qemu are aligned up to 1 MiB boundaries. There are
two places where this was done once for the total size and then for
individual NUMA cell sizes.
Add a function that will align the sizes in one place so that it's clear
where the sizes are aligned.
---
src/qemu/qemu_command.c | 7 +++----
src/qemu/qemu_domain.c | 21 +++++++++++++++++++++
src/qemu/qemu_domain.h | 2 ++
3 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 045ecaa..f76b89c 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7178,9 +7178,6 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
/* using of -numa memdev= cannot be combined with -numa mem=, thus we
* need to check which approach to use */
for (i = 0; i < ncells; i++) {
- unsigned long long cellmem = virDomainNumaGetNodeMemorySize(def->numa, i);
- virDomainNumaSetNodeMemorySize(def->numa, i, VIR_ROUND_UP(cellmem, 1024));
-
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) {
if ((rc = qemuBuildMemoryCellBackendStr(def, qemuCaps, cfg, i,
@@ -8355,13 +8352,15 @@ qemuBuildCommandLine(virConnectPtr conn,
if (qemuBuildDomainLoaderCommandLine(cmd, def, qemuCaps) < 0)
goto error;
+ if (qemuDomainAlignMemorySizes(def) < 0)
+ goto error;
+
/* Set '-m MB' based on maxmem, because the lower 'memory' limit
* is set post-startup using the balloon driver. If balloon driver
* is not supported, then they're out of luck anyway. Update the
* XML to reflect our rounding.
*/
virCommandAddArg(cmd, "-m");
- virDomainDefSetMemoryInitial(def, VIR_ROUND_UP(virDomainDefGetMemoryInitial(def),
1024));
virCommandAddArgFormat(cmd, "%llu", virDomainDefGetMemoryInitial(def) /
1024);
if (def->mem.nhugepages && !virDomainNumaGetNodeCount(def->numa)) {
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d8a2087..e5f11fc 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2852,3 +2852,24 @@ qemuDomObjEndAPI(virDomainObjPtr *vm)
virObjectUnref(*vm);
*vm = NULL;
}
+
+
+int
+qemuDomainAlignMemorySizes(virDomainDefPtr def)
+{
+ unsigned long long mem;
+ size_t ncells = virDomainNumaGetNodeCount(def->numa);
+ size_t i;
+
+ /* align NUMA cell sizes if relevant */
+ for (i = 0; i < ncells; i++) {
+ mem = virDomainNumaGetNodeMemorySize(def->numa, i);
+ virDomainNumaSetNodeMemorySize(def->numa, i, VIR_ROUND_UP(mem, 1024));
+ }
+
+ /* align initial memory size */
+ mem = virDomainDefGetMemoryInitial(def);
+ virDomainDefSetMemoryInitial(def, VIR_ROUND_UP(mem, 1024));
+
+ return 0;
+}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index fe3e2b1..9760095 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -414,4 +414,6 @@ int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
void qemuDomObjEndAPI(virDomainObjPtr *vm);
+int qemuDomainAlignMemorySizes(virDomainDefPtr def);
+
#endif /* __QEMU_DOMAIN_H__ */
--
2.2.2