[PATCH] qemu_domain: Partially validate memory amounts when auto-adding NUMA node
Kristina Hanicova
khanicov at redhat.com
Tue Jul 25 12:40:15 UTC 2023
On Fri, Jul 21, 2023 at 1:13 PM Michal Privoznik <mprivozn at redhat.com>
wrote:
> When automatically adding a NUMA node (qemuDomainDefNumaAutoAdd()) the
> memory size of the node is computed as:
>
> total_memory - sum(memory devices)
>
> And we have a nice helper for that: virDomainDefGetMemoryInitial() so
> it looks logical to just call it. Except, this code runs in post parse
> callback, i.e. memory sizes were not validated and it may happen that
> the sum is greater than the total memory. This would be caught by
> virDomainDefPostParseMemory() but that runs only after driver specific
> callbacks (i.e. after qemuDomainDefNumaAutoAdd()) and because the
> domain config was changed and memory was increased to this huge
> number no error is caught.
>
> So let's do what virDomainDefGetMemoryInitial() would do, but
> with error checking.
>
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2216236
> Fixes: f5d4f5c8ee44e9f1939070afcc5381bdd5545e50
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_domain.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 6eea8a9fa5..fdda001795 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -4821,17 +4821,24 @@ qemuDomainDefNumaAutoAdd(virDomainDef *def,
> return 0;
> }
>
> - initialMem = virDomainDefGetMemoryInitial(def);
> + initialMem = virDomainDefGetMemoryTotal(def);
>
I would prefer if this variable was renamed to totalMem / remainingMem /
availableMem.
>
> 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 > initialMem) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("Total size of memory devices exceeds the
> total memory size"));
> + return -1;
> + }
> +
> + initialMem -= 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, initialMem);
> +
> return 0;
> }
>
> --
> 2.41.0
>
>
Reviewed-by: Kristina Hanicova <khanicov at redhat.com>
Kristina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20230725/482a2386/attachment.htm>
More information about the libvir-list
mailing list