diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index 7506e21e6fcb7da1ab080275ce5afeaedb63926d..3fb086f4ba5b8f5de6b5cac7e44e7c805637a704 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -777,7 +777,8 @@ virDomainNumaDefCPUFormat(virBufferPtr buf, virBufferAddLit(buf, "cells[i].mem); + virBufferAsprintf(buf, " memory='%llu'", + virDomainNumaGetNodeMemorySize(def, i)); virBufferAddLit(buf, " unit='KiB'"); if (memAccess) virBufferAsprintf(buf, " memAccess='%s'", @@ -840,3 +841,20 @@ virDomainNumaGetNodeMemoryAccessMode(virCPUDefPtr numa, { return numa->cells[node].memAccess; } + + +unsigned long long +virDomainNumaGetNodeMemorySize(virCPUDefPtr numa, + size_t node) +{ + return numa->cells[node].mem; +} + + +void +virDomainNumaSetNodeMemorySize(virCPUDefPtr numa, + size_t node, + unsigned long long size) +{ + numa->cells[node].mem = size; +} diff --git a/src/conf/numa_conf.h b/src/conf/numa_conf.h index 8ebce4982a3e739ec022dcf0b70d67b854f39489..cda850b3d0eaa19226c9f8065d7065a97b63cfa3 100644 --- a/src/conf/numa_conf.h +++ b/src/conf/numa_conf.h @@ -94,6 +94,9 @@ virBitmapPtr virDomainNumaGetNodeCpumask(virCPUDefPtr numa, virNumaMemAccess virDomainNumaGetNodeMemoryAccessMode(virCPUDefPtr numa, size_t node) ATTRIBUTE_NONNULL(1); +unsigned long long virDomainNumaGetNodeMemorySize(virCPUDefPtr numa, + size_t node) + ATTRIBUTE_NONNULL(1); /* * Formatters @@ -117,6 +120,11 @@ int virDomainNumatuneSet(virDomainNumaPtr numa, virBitmapPtr nodeset) ATTRIBUTE_NONNULL(1); +void virDomainNumaSetNodeMemorySize(virCPUDefPtr numa, + size_t node, + unsigned long long size) + ATTRIBUTE_NONNULL(1); + /* * Other accessors */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ab3a014b55232d2408333043b4f69ce6a25a5bec..3bc3f8768931dcad12992d8460821bab2c4dafae 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -632,7 +632,9 @@ virDomainNumaFree; virDomainNumaGetNodeCount; virDomainNumaGetNodeCpumask; virDomainNumaGetNodeMemoryAccessMode; +virDomainNumaGetNodeMemorySize; virDomainNumaNew; +virDomainNumaSetNodeMemorySize; virDomainNumatuneFormatNodeset; virDomainNumatuneFormatXML; virDomainNumatuneGetMode; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d5cb190dc45b6949974cc0c038f7edbbeb4099c7..dec7a326a77c51f9538b0179b57aa40c5d61a186 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4747,7 +4747,8 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, if (virAsprintf(&alias, "ram-node%zu", cell) < 0) goto cleanup; - if ((rc = qemuBuildMemoryBackendStr(def->cpu->cells[cell].mem, 0, cell, + if ((rc = qemuBuildMemoryBackendStr(virDomainNumaGetNodeMemorySize(def->cpu, cell), + 0, cell, NULL, auto_nodeset, def, qemuCaps, cfg, &backendType, &props, false)) < 0) @@ -7176,8 +7177,8 @@ 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 = VIR_DIV_UP(def->cpu->cells[i].mem, 1024); - def->cpu->cells[i].mem = cellmem * 1024; + unsigned long long cellmem = virDomainNumaGetNodeMemorySize(def->cpu, i); + virDomainNumaSetNodeMemorySize(def->cpu, i, VIR_ROUND_UP(cellmem, 1024)); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) || virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) { @@ -7227,7 +7228,8 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, if (needBackend) virBufferAsprintf(&buf, ",memdev=ram-node%zu", i); else - virBufferAsprintf(&buf, ",mem=%llu", def->cpu->cells[i].mem / 1024); + virBufferAsprintf(&buf, ",mem=%llu", + virDomainNumaGetNodeMemorySize(def->cpu, i) / 1024); virCommandAddArgBuffer(cmd, &buf); }