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 b3b573b..ac96583 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7270,9 +7270,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, @@ -8495,13 +8492,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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list