[libvirt] [PATCH] qemu: process: Improve update of maximum baloon state at startup
Martin Kletzander
mkletzan at redhat.com
Tue Jun 30 15:43:30 UTC 2015
On Tue, Jun 30, 2015 at 04:38:13PM +0200, Peter Krempa wrote:
>In commit 641a145d73fdc3dd9350fd57b3d3247abf101c05 I've added code that
>resets the ballon memory value to full size prior to resuming the vCPUs
>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 | 35 ++++++++++++++++++++++++++++++++++-
> 1 file changed, 34 insertions(+), 1 deletion(-)
>
>diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>index ba84182..5698404 100644
>--- a/src/qemu/qemu_process.c
>+++ b/src/qemu/qemu_process.c
>@@ -2065,6 +2065,35 @@ qemuProcessReconnectRefreshChannelVirtioState(virQEMUDriverPtr driver,
>
>
> static int
>+qemuProcessRefreshBallonState(virQEMUDriverPtr driver,
>+ virDomainObjPtr vm)
Shouldn't this also accept int asyncJob parameter so that it works
similarly to qemuProcessUpdateVideoRamSize() in the qemuProcessStart()?
>+{
>+ 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;
>+ }
>+
>+ qemuDomainObjEnterMonitor(driver, vm);
>+ 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 +3808,9 @@ qemuProcessReconnect(void *opaque)
> if (qemuProcessReconnectRefreshChannelVirtioState(driver, obj) < 0)
> goto error;
>
>+ if (qemuProcessRefreshBallonState(driver, obj) < 0)
>+ goto error;
>+
> if (qemuProcessRecoverJob(driver, obj, conn, &oldjob) < 0)
> goto error;
>
>@@ -4922,7 +4954,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) < 0)
>+ goto cleanup;
>
> VIR_DEBUG("Detecting actual memory size for video device");
> if (qemuProcessUpdateVideoRamSize(driver, vm, asyncJob) < 0)
>--
>2.4.1
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150630/9ce4270c/attachment-0001.sig>
More information about the libvir-list
mailing list