1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-23 21:34:54 +03:00

qemu: process: Improve update of maximum balloon state at startup

In commit 641a145d73 I've added code that
resets the balloon memory value to full size prior to resuming the vCPUs
since the size certainly was not reduced at that point.

Since qemuProcessStart is used also in code paths with already booted
up guests (migration, save/restore) the assumption is not entirely true
since the guest might already been running before.

This patch adds a function that queries the monitor rather than using
the full size since a balloon event would not be reissued in case we are
recovering a saved migration state.

Additionally the new function is used also when reconnecting to a VM
after libvirtd restart since we might have missed a few balloon events
while libvirtd was not running.
This commit is contained in:
Peter Krempa 2015-06-30 16:31:24 +02:00
parent 1cf25f6334
commit c212e0c779

View File

@ -2115,6 +2115,38 @@ qemuProcessReconnectRefreshChannelVirtioState(virQEMUDriverPtr driver,
} }
static int
qemuProcessRefreshBalloonState(virQEMUDriverPtr driver,
virDomainObjPtr vm,
int asyncJob)
{
unsigned long long balloon;
int rc;
/* if no ballooning is available, the current size equals to the current
* full memory size */
if (!vm->def->memballoon ||
vm->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE) {
vm->def->mem.cur_balloon = virDomainDefGetMemoryActual(vm->def);
return 0;
}
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
rc = qemuMonitorGetBalloonInfo(qemuDomainGetMonitor(vm), &balloon);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
rc = -1;
if (rc < 0)
return -1;
vm->def->mem.cur_balloon = balloon;
return 0;
}
static int static int
qemuProcessWaitForMonitor(virQEMUDriverPtr driver, qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
@ -3830,6 +3862,9 @@ qemuProcessReconnect(void *opaque)
if (qemuProcessReconnectRefreshChannelVirtioState(driver, obj) < 0) if (qemuProcessReconnectRefreshChannelVirtioState(driver, obj) < 0)
goto error; goto error;
if (qemuProcessRefreshBalloonState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
goto error;
if (qemuProcessRecoverJob(driver, obj, conn, &oldjob) < 0) if (qemuProcessRecoverJob(driver, obj, conn, &oldjob) < 0)
goto error; goto error;
@ -4971,10 +5006,11 @@ int qemuProcessStart(virConnectPtr conn,
goto cleanup; goto cleanup;
} }
/* Since CPUs were not started yet, the ballon could not return the memory /* Since CPUs were not started yet, the balloon could not return the memory
* to the host and thus cur_balloon needs to be updated so that GetXMLdesc * to the host and thus cur_balloon needs to be updated so that GetXMLdesc
* and friends return the correct size in case they can't grab the job */ * and friends return the correct size in case they can't grab the job */
vm->def->mem.cur_balloon = virDomainDefGetMemoryActual(vm->def); if (qemuProcessRefreshBalloonState(driver, vm, asyncJob) < 0)
goto cleanup;
VIR_DEBUG("Detecting actual memory size for video device"); VIR_DEBUG("Detecting actual memory size for video device");
if (qemuProcessUpdateVideoRamSize(driver, vm, asyncJob) < 0) if (qemuProcessUpdateVideoRamSize(driver, vm, asyncJob) < 0)