qemuDomainSetMemoryFlags: Take virtio-mem into consideration

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@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Michal Privoznik 2021-03-16 19:09:27 +01:00
parent 51f65e9522
commit b1c3b5dfec

View File

@ -2381,12 +2381,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 (!def || oldmax > virDomainDefGetMemoryTotal(persistentDef)) {
oldmax = virDomainDefGetMemoryTotal(persistentDef);
for (i = 0; i < persistentDef->nmems; i++) {
if (persistentDef->mems[i]->model == VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM)
oldmax -= persistentDef->mems[i]->size;
}
}
}
if (newmem > oldmax) {