[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