[libvirt] [PATCH 8/8] qemu: hotplug: Properly recalculate/reload balloon size after hot(un)plug

Peter Krempa pkrempa at redhat.com
Wed Apr 6 16:02:28 UTC 2016


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 | 15 ++++++---------
 src/qemu/qemu_process.c |  2 +-
 src/qemu/qemu_process.h |  4 ++++
 3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 48bea6a..f77d65a 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -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;
@@ -2939,13 +2935,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));

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index a8c5139..c7456af 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1923,7 +1923,7 @@ qemuRefreshVirtioChannelState(virQEMUDriverPtr driver,
 }


-static int
+int
 qemuProcessRefreshBalloonState(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
                                int asyncJob)
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index d5f50f2..98cc9a8 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -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__ */
-- 
2.8.0




More information about the libvir-list mailing list