From 2f37362e44400d91f51c9e147f71e98a4eca42c0 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 30 Apr 2015 18:03:41 +0200 Subject: [PATCH] qemu: Fix balloon size handling with memory hot(un)plug Since libvirt doesn't call to update the new balloon size in qemu add code that will handle tweaking of the size of the current balloon statistic until qemu reports the new size using the event. --- src/qemu/qemu_driver.c | 3 +++ src/qemu/qemu_hotplug.c | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8099d6049f..33c1cfd4cd 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8373,6 +8373,9 @@ qemuDomainAttachDeviceConfig(virQEMUCapsPtr qemuCaps, return -1; } + if (vmdef->mem.cur_balloon == virDomainDefGetMemoryActual(vmdef)) + vmdef->mem.cur_balloon += dev->data.memory->size; + if (virDomainMemoryInsert(vmdef, dev->data.memory) < 0) return -1; dev->data.memory = NULL; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 095ed88adb..fc45de1a5b 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1726,6 +1726,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, const char *backendType; virJSONValuePtr props = NULL; virObjectEventPtr event; + bool fix_balloon = false; int id; int ret = -1; @@ -1741,6 +1742,9 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, if (virAsprintf(&objalias, "mem%s", mem->info.alias) < 0) goto cleanup; + if (vm->def->mem.cur_balloon == virDomainDefGetMemoryActual(vm->def)) + fix_balloon = true; + if (!(devstr = qemuBuildMemoryDeviceStr(mem, vm->def, priv->qemuCaps))) goto cleanup; @@ -1779,6 +1783,10 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, if (event) qemuDomainEventQueue(driver, event); + /* fix the balloon size if it was set to maximum */ + if (fix_balloon) + vm->def->mem.cur_balloon += mem->size; + /* mem is consumed by vm->def */ mem = NULL; @@ -2896,6 +2904,8 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) goto error; + vm->def->mem.cur_balloon -= mem->size; + if ((idx = virDomainMemoryFindByDef(vm->def, mem)) >= 0) virDomainMemoryRemove(vm->def, idx); -- 2.39.5