mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
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.
This commit is contained in:
parent
4f9907cd11
commit
57b215ab25
@ -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,
|
|||||||
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)
|
|||||||
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);
|
|||||||
|
|
||||||
void qemuDomObjEndAPI(virDomainObjPtr *vm);
|
void qemuDomObjEndAPI(virDomainObjPtr *vm);
|
||||||
|
|
||||||
|
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
|
||||||
|
|
||||||
#endif /* __QEMU_DOMAIN_H__ */
|
#endif /* __QEMU_DOMAIN_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user