diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 6eea8a9fa5..029238a9d7 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4812,7 +4812,7 @@ qemuDomainDefNumaAutoAdd(virDomainDef *def, unsigned int parseFlags) { bool abiUpdate = !!(parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE); - unsigned long long initialMem; + unsigned long long nodeMem; size_t i; if (!abiUpdate || @@ -4821,17 +4821,24 @@ qemuDomainDefNumaAutoAdd(virDomainDef *def, return 0; } - initialMem = virDomainDefGetMemoryInitial(def); + nodeMem = virDomainDefGetMemoryTotal(def); if (!def->numa) def->numa = virDomainNumaNew(); virDomainNumaSetNodeCount(def->numa, 1); - virDomainNumaSetNodeMemorySize(def->numa, 0, initialMem); for (i = 0; i < def->nmems; i++) { virDomainMemoryDef *mem = def->mems[i]; + if (mem->size > nodeMem) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Total size of memory devices exceeds the total memory size")); + return -1; + } + + nodeMem -= mem->size; + switch (mem->model) { case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: @@ -4848,6 +4855,8 @@ qemuDomainDefNumaAutoAdd(virDomainDef *def, } } + virDomainNumaSetNodeMemorySize(def->numa, 0, nodeMem); + return 0; }