]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: hotplug: Properly recalculate/reload balloon size after hot(un)plug
authorPeter Krempa <pkrempa@redhat.com>
Wed, 6 Apr 2016 13:57:57 +0000 (15:57 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 15 Apr 2016 12:27:09 +0000 (14:27 +0200)
Rather than trying some magic calculations on our side query the monitor
for the current size of the memory balloon both on hotplug and
hotunplug.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1220702

src/qemu/qemu_hotplug.c
src/qemu/qemu_process.c
src/qemu/qemu_process.h

index b72b08018a8f1122a886e50a20f3d1beb2b92394..ef8696be4690c0e202f20eb6f2bbf08a2ea6e0fc 100644 (file)
@@ -33,6 +33,7 @@
 #include "qemu_command.h"
 #include "qemu_hostdev.h"
 #include "qemu_interface.h"
+#include "qemu_process.h"
 #include "domain_audit.h"
 #include "netdev_bandwidth_conf.h"
 #include "domain_nwfilter.h"
@@ -1742,7 +1743,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
     const char *backendType;
     virJSONValuePtr props = NULL;
     virObjectEventPtr event;
-    bool fix_balloon = false;
     int id;
     int ret = -1;
 
@@ -1757,9 +1757,6 @@ 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)))
         goto cleanup;
 
@@ -1800,9 +1797,8 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
     event = virDomainEventDeviceAddedNewFromObj(vm, objalias);
     qemuDomainEventQueue(driver, event);
 
-    /* fix the balloon size if it was set to maximum */
-    if (fix_balloon)
-        vm->def->mem.cur_balloon += mem->size;
+    /* fix the balloon size */
+    ignore_value(qemuProcessRefreshBalloonState(driver, vm, QEMU_ASYNC_JOB_NONE));
 
     /* mem is consumed by vm->def */
     mem = NULL;
@@ -2938,13 +2934,14 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver,
     if (rc < 0)
         return -1;
 
-    vm->def->mem.cur_balloon -= mem->size;
-
     if ((idx = virDomainMemoryFindByDef(vm->def, mem)) >= 0)
         virDomainMemoryRemove(vm->def, idx);
 
     virDomainMemoryDefFree(mem);
 
+    /* fix the balloon size */
+    ignore_value(qemuProcessRefreshBalloonState(driver, vm, QEMU_ASYNC_JOB_NONE));
+
     /* decrease the mlock limit after memory unplug if necessary */
     ignore_value(qemuDomainAdjustMaxMemLock(vm));
 
index de5c52f753d24e7cf6f0e6ebba225b635f0642e3..3da23ce3d8e31e8de3bc21337491515e8e7ffef8 100644 (file)
@@ -1993,7 +1993,7 @@ qemuRefreshVirtioChannelState(virQEMUDriverPtr driver,
 }
 
 
-static int
+int
 qemuProcessRefreshBalloonState(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
                                int asyncJob)
index d5f50f2a674161cc0c2dd9c5720f045eb879da9b..98cc9a849f37bcc7efaccbb5627e9eec03014c67 100644 (file)
@@ -193,4 +193,8 @@ int qemuProcessSetupIOThread(virDomainObjPtr vm,
 
 int qemuRefreshVirtioChannelState(virQEMUDriverPtr driver,
                                   virDomainObjPtr vm);
+
+int qemuProcessRefreshBalloonState(virQEMUDriverPtr driver,
+                                   virDomainObjPtr vm,
+                                   int asyncJob);
 #endif /* __QEMU_PROCESS_H__ */