[PATCH v3 11/14] qemuDomainSetMemoryFlags: Take virtio-mem into consideration
Peter Krempa
pkrempa at redhat.com
Mon May 3 14:20:42 UTC 2021
On Fri, Apr 23, 2021 at 15:24:33 +0200, Michal Privoznik wrote:
> The qemuDomainSetMemoryFlags() allows for memballoon
> (<currentMemory/>) changes for both active and inactive guests.
> And just before doing any change, we have to make sure that the
> new size is not greater than the total memory (<memory/>).
>
> However, the total memory includes not only the regular guest
> memory, but also sum of maximum sizes of all virtio-mems (in fact
> all memory devices for that matter). But virtio-mem devices are
> modified differently (via virDomainUpdateDevice()) and thus the
> upper limit for new balloon size has to be lowered.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_driver.c | 20 ++++++++++++++++++--
> 1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index e376a64bee..6a9da62ded 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2433,12 +2433,28 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> } else {
> /* resize the current memory */
> unsigned long oldmax = 0;
> + size_t i;
>
> - if (def)
> + if (def) {
> oldmax = virDomainDefGetMemoryTotal(def);
> +
> + /* While virtio-mem is regular mem from guest POV, it can't be
> + * modified through this API. */
> + for (i = 0; i < def->nmems; i++) {
> + if (def->mems[i]->model == VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM)
> + oldmax -= def->mems[i]->size;
> + }
> + }
> +
> if (persistentDef) {
> - if (!oldmax || oldmax > virDomainDefGetMemoryTotal(persistentDef))
> + if (!oldmax || oldmax > virDomainDefGetMemoryTotal(persistentDef)) {
IMO this code will not be correct any more when you do the subtraction
of virtio-mem devices above as you compare it with the total memory of
the persistent def.
More information about the libvir-list
mailing list