提交 6306ee62 编写于 作者: P Peter Krempa

qemu: hotplug: Properly recalculate/reload balloon size after hot(un)plug

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
上级 1996da21
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "qemu_command.h" #include "qemu_command.h"
#include "qemu_hostdev.h" #include "qemu_hostdev.h"
#include "qemu_interface.h" #include "qemu_interface.h"
#include "qemu_process.h"
#include "domain_audit.h" #include "domain_audit.h"
#include "netdev_bandwidth_conf.h" #include "netdev_bandwidth_conf.h"
#include "domain_nwfilter.h" #include "domain_nwfilter.h"
...@@ -1742,7 +1743,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, ...@@ -1742,7 +1743,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
const char *backendType; const char *backendType;
virJSONValuePtr props = NULL; virJSONValuePtr props = NULL;
virObjectEventPtr event; virObjectEventPtr event;
bool fix_balloon = false;
int id; int id;
int ret = -1; int ret = -1;
...@@ -1757,9 +1757,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, ...@@ -1757,9 +1757,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
if (virAsprintf(&objalias, "mem%s", mem->info.alias) < 0) if (virAsprintf(&objalias, "mem%s", mem->info.alias) < 0)
goto cleanup; goto cleanup;
if (vm->def->mem.cur_balloon == virDomainDefGetMemoryActual(vm->def))
fix_balloon = true;
if (!(devstr = qemuBuildMemoryDeviceStr(mem))) if (!(devstr = qemuBuildMemoryDeviceStr(mem)))
goto cleanup; goto cleanup;
...@@ -1800,9 +1797,8 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, ...@@ -1800,9 +1797,8 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
event = virDomainEventDeviceAddedNewFromObj(vm, objalias); event = virDomainEventDeviceAddedNewFromObj(vm, objalias);
qemuDomainEventQueue(driver, event); qemuDomainEventQueue(driver, event);
/* fix the balloon size if it was set to maximum */ /* fix the balloon size */
if (fix_balloon) ignore_value(qemuProcessRefreshBalloonState(driver, vm, QEMU_ASYNC_JOB_NONE));
vm->def->mem.cur_balloon += mem->size;
/* mem is consumed by vm->def */ /* mem is consumed by vm->def */
mem = NULL; mem = NULL;
...@@ -2938,13 +2934,14 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, ...@@ -2938,13 +2934,14 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver,
if (rc < 0) if (rc < 0)
return -1; return -1;
vm->def->mem.cur_balloon -= mem->size;
if ((idx = virDomainMemoryFindByDef(vm->def, mem)) >= 0) if ((idx = virDomainMemoryFindByDef(vm->def, mem)) >= 0)
virDomainMemoryRemove(vm->def, idx); virDomainMemoryRemove(vm->def, idx);
virDomainMemoryDefFree(mem); virDomainMemoryDefFree(mem);
/* fix the balloon size */
ignore_value(qemuProcessRefreshBalloonState(driver, vm, QEMU_ASYNC_JOB_NONE));
/* decrease the mlock limit after memory unplug if necessary */ /* decrease the mlock limit after memory unplug if necessary */
ignore_value(qemuDomainAdjustMaxMemLock(vm)); ignore_value(qemuDomainAdjustMaxMemLock(vm));
......
...@@ -1993,7 +1993,7 @@ qemuRefreshVirtioChannelState(virQEMUDriverPtr driver, ...@@ -1993,7 +1993,7 @@ qemuRefreshVirtioChannelState(virQEMUDriverPtr driver,
} }
static int int
qemuProcessRefreshBalloonState(virQEMUDriverPtr driver, qemuProcessRefreshBalloonState(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
int asyncJob) int asyncJob)
......
...@@ -193,4 +193,8 @@ int qemuProcessSetupIOThread(virDomainObjPtr vm, ...@@ -193,4 +193,8 @@ int qemuProcessSetupIOThread(virDomainObjPtr vm,
int qemuRefreshVirtioChannelState(virQEMUDriverPtr driver, int qemuRefreshVirtioChannelState(virQEMUDriverPtr driver,
virDomainObjPtr vm); virDomainObjPtr vm);
int qemuProcessRefreshBalloonState(virQEMUDriverPtr driver,
virDomainObjPtr vm,
int asyncJob);
#endif /* __QEMU_PROCESS_H__ */ #endif /* __QEMU_PROCESS_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册