[libvirt] [PATCH v2] qemu: process: Improve update of maximum baloon state at startup
John Ferlan
jferlan at redhat.com
Tue Jul 14 11:56:52 UTC 2015
title:
s/baloon/balloon
On 07/01/2015 04:13 AM, Peter Krempa wrote:
> In commit 641a145d73fdc3dd9350fd57b3d3247abf101c05 I've added code that
> resets the ballon memory value to full size prior to resuming the vCPUs
s/ballon/balloon
ACK with all the incorrect spellings fixed (including one introduced in
the referenced commit).
John
> since the size certainly was not reduced at that point.
>
> Since qemuProcess start 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 ballon events
^^
> while libvirtd was not running.
> ---
> src/qemu/qemu_process.c | 38 +++++++++++++++++++++++++++++++++++++-
> 1 file changed, 37 insertions(+), 1 deletion(-)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index ba84182..13b1696 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2065,6 +2065,38 @@ qemuProcessReconnectRefreshChannelVirtioState(virQEMUDriverPtr driver,
>
>
> static int
> +qemuProcessRefreshBallonState(virQEMUDriverPtr driver,
^^
> + virDomainObjPtr vm,
> + int asyncJob)
> +{
> + unsigned long long balloon;
> + int rc;
> +
> + /* if no balloning 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
> qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> int asyncJob,
> @@ -3779,6 +3811,9 @@ qemuProcessReconnect(void *opaque)
> if (qemuProcessReconnectRefreshChannelVirtioState(driver, obj) < 0)
> goto error;
>
> + if (qemuProcessRefreshBallonState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
^^
> + goto error;
> +
> if (qemuProcessRecoverJob(driver, obj, conn, &oldjob) < 0)
> goto error;
>
> @@ -4922,7 +4957,8 @@ int qemuProcessStart(virConnectPtr conn,
> /* Since CPUs were not started yet, the ballon could not return the memory
^^
> * 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 */
> - vm->def->mem.cur_balloon = virDomainDefGetMemoryActual(vm->def);
> + if (qemuProcessRefreshBallonState(driver, vm, asyncJob) < 0)
^^
> + goto cleanup;
>
> VIR_DEBUG("Detecting actual memory size for video device");
> if (qemuProcessUpdateVideoRamSize(driver, vm, asyncJob) < 0)
>
More information about the libvir-list
mailing list