提交 57b215ab 编写于 作者: P Peter Krempa

qemu: command: Add helper to align memory sizes

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.
上级 4f9907cd
...@@ -7270,9 +7270,6 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, ...@@ -7270,9 +7270,6 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
/* using of -numa memdev= cannot be combined with -numa mem=, thus we /* using of -numa memdev= cannot be combined with -numa mem=, thus we
* need to check which approach to use */ * need to check which approach to use */
for (i = 0; i < ncells; i++) { 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) || if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) { virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) {
if ((rc = qemuBuildMemoryCellBackendStr(def, qemuCaps, cfg, i, if ((rc = qemuBuildMemoryCellBackendStr(def, qemuCaps, cfg, i,
...@@ -8490,13 +8487,15 @@ qemuBuildCommandLine(virConnectPtr conn, ...@@ -8490,13 +8487,15 @@ qemuBuildCommandLine(virConnectPtr conn,
if (qemuBuildDomainLoaderCommandLine(cmd, def, qemuCaps) < 0) if (qemuBuildDomainLoaderCommandLine(cmd, def, qemuCaps) < 0)
goto error; goto error;
if (qemuDomainAlignMemorySizes(def) < 0)
goto error;
/* Set '-m MB' based on maxmem, because the lower 'memory' limit /* Set '-m MB' based on maxmem, because the lower 'memory' limit
* is set post-startup using the balloon driver. If balloon driver * is set post-startup using the balloon driver. If balloon driver
* is not supported, then they're out of luck anyway. Update the * is not supported, then they're out of luck anyway. Update the
* XML to reflect our rounding. * XML to reflect our rounding.
*/ */
virCommandAddArg(cmd, "-m"); virCommandAddArg(cmd, "-m");
virDomainDefSetMemoryInitial(def, VIR_ROUND_UP(virDomainDefGetMemoryInitial(def), 1024));
virCommandAddArgFormat(cmd, "%llu", virDomainDefGetMemoryInitial(def) / 1024); virCommandAddArgFormat(cmd, "%llu", virDomainDefGetMemoryInitial(def) / 1024);
if (def->mem.nhugepages && !virDomainNumaGetNodeCount(def->numa)) { if (def->mem.nhugepages && !virDomainNumaGetNodeCount(def->numa)) {
......
...@@ -2875,3 +2875,24 @@ qemuDomObjEndAPI(virDomainObjPtr *vm) ...@@ -2875,3 +2875,24 @@ qemuDomObjEndAPI(virDomainObjPtr *vm)
virObjectUnref(*vm); virObjectUnref(*vm);
*vm = NULL; *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;
}
...@@ -418,4 +418,6 @@ bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk); ...@@ -418,4 +418,6 @@ bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
void qemuDomObjEndAPI(virDomainObjPtr *vm); void qemuDomObjEndAPI(virDomainObjPtr *vm);
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
#endif /* __QEMU_DOMAIN_H__ */ #endif /* __QEMU_DOMAIN_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册