mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
Add API for issuing 'balloon' monitor command
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new qemuMonitorSetBalloon() based on existing code in qemudDomainSetMemoryBalloon * src/qemu/qemu_driver.c: Remove use of qemudDomainSetMemoryBalloon() in favour of qemuMonitorSetBalloon(). Fix error code when balloon is not supported
This commit is contained in:
parent
6f19c16c78
commit
eff29c8b28
@ -107,9 +107,6 @@ static void qemudShutdownVMDaemon(virConnectPtr conn,
|
|||||||
|
|
||||||
static int qemudDomainGetMaxVcpus(virDomainPtr dom);
|
static int qemudDomainGetMaxVcpus(virDomainPtr dom);
|
||||||
|
|
||||||
static int qemudDomainSetMemoryBalloon(virConnectPtr conn,
|
|
||||||
virDomainObjPtr vm,
|
|
||||||
unsigned long newmem);
|
|
||||||
static int qemuDetectVcpuPIDs(virConnectPtr conn,
|
static int qemuDetectVcpuPIDs(virConnectPtr conn,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
|
|
||||||
@ -2137,7 +2134,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
|
|||||||
(qemuDetectVcpuPIDs(conn, vm) < 0) ||
|
(qemuDetectVcpuPIDs(conn, vm) < 0) ||
|
||||||
(qemudInitCpus(conn, vm, migrateFrom) < 0) ||
|
(qemudInitCpus(conn, vm, migrateFrom) < 0) ||
|
||||||
(qemuInitPasswords(driver, vm) < 0) ||
|
(qemuInitPasswords(driver, vm) < 0) ||
|
||||||
(qemudDomainSetMemoryBalloon(conn, vm, vm->def->memory) < 0) ||
|
(qemuMonitorSetBalloon(vm, vm->def->memory) < 0) ||
|
||||||
(virDomainSaveStatus(conn, driver->stateDir, vm) < 0)) {
|
(virDomainSaveStatus(conn, driver->stateDir, vm) < 0)) {
|
||||||
qemudShutdownVMDaemon(conn, driver, vm);
|
qemudShutdownVMDaemon(conn, driver, vm);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
@ -2999,50 +2996,6 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns: 0 if balloon not supported, +1 if balloon query worked
|
|
||||||
* or -1 on failure
|
|
||||||
*/
|
|
||||||
static int qemudDomainSetMemoryBalloon(virConnectPtr conn,
|
|
||||||
virDomainObjPtr vm,
|
|
||||||
unsigned long newmem) {
|
|
||||||
char *cmd;
|
|
||||||
char *reply = NULL;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'newmem' is in KB, QEMU monitor works in MB, and we all wish
|
|
||||||
* we just worked in bytes with unsigned long long everywhere.
|
|
||||||
*/
|
|
||||||
if (virAsprintf(&cmd, "balloon %lu", (newmem / 1024)) < 0) {
|
|
||||||
virReportOOMError(conn);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
|
|
||||||
qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
|
|
||||||
"%s", _("could not balloon memory allocation"));
|
|
||||||
VIR_FREE(cmd);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
VIR_FREE(cmd);
|
|
||||||
|
|
||||||
/* If the command failed qemu prints: 'unknown command'
|
|
||||||
* No message is printed on success it seems */
|
|
||||||
DEBUG ("%s: balloon reply: %s",vm->def->name, reply);
|
|
||||||
if (strstr(reply, "\nunknown command:")) {
|
|
||||||
/* Don't set error - it is expected memory balloon fails on many qemu */
|
|
||||||
ret = 0;
|
|
||||||
} else {
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
VIR_FREE(reply);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int qemudDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
|
static int qemudDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
|
||||||
struct qemud_driver *driver = dom->conn->privateData;
|
struct qemud_driver *driver = dom->conn->privateData;
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
@ -3066,10 +3019,13 @@ static int qemudDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainIsActive(vm)) {
|
if (virDomainIsActive(vm)) {
|
||||||
ret = qemudDomainSetMemoryBalloon(dom->conn, vm, newmem);
|
ret = qemuMonitorSetBalloon(vm, newmem);
|
||||||
if (ret == 0)
|
/* Turn lack of balloon support into a fatal error */
|
||||||
|
if (ret == 0) {
|
||||||
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
|
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
|
||||||
"%s", _("cannot set memory of an active domain"));
|
"%s", _("cannot set memory of an active domain"));
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
vm->def->memory = newmem;
|
vm->def->memory = newmem;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -551,6 +551,10 @@ error:
|
|||||||
/* The reply from QEMU contains 'ballon: actual=421' where value is in MB */
|
/* The reply from QEMU contains 'ballon: actual=421' where value is in MB */
|
||||||
#define BALLOON_PREFIX "balloon: actual="
|
#define BALLOON_PREFIX "balloon: actual="
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns: 0 if balloon not supported, +1 if balloon query worked
|
||||||
|
* or -1 on failure
|
||||||
|
*/
|
||||||
int qemuMonitorGetBalloonInfo(const virDomainObjPtr vm,
|
int qemuMonitorGetBalloonInfo(const virDomainObjPtr vm,
|
||||||
unsigned long *currmem)
|
unsigned long *currmem)
|
||||||
{
|
{
|
||||||
@ -604,3 +608,46 @@ int qemuMonitorSetVNCPassword(const virDomainObjPtr vm,
|
|||||||
VIR_FREE(info);
|
VIR_FREE(info);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns: 0 if balloon not supported, +1 if balloon adjust worked
|
||||||
|
* or -1 on failure
|
||||||
|
*/
|
||||||
|
int qemuMonitorSetBalloon(const virDomainObjPtr vm,
|
||||||
|
unsigned long newmem)
|
||||||
|
{
|
||||||
|
char *cmd;
|
||||||
|
char *reply = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 'newmem' is in KB, QEMU monitor works in MB, and we all wish
|
||||||
|
* we just worked in bytes with unsigned long long everywhere.
|
||||||
|
*/
|
||||||
|
if (virAsprintf(&cmd, "balloon %lu", (newmem / 1024)) < 0) {
|
||||||
|
virReportOOMError(NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
|
||||||
|
qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||||
|
"%s", _("could not balloon memory allocation"));
|
||||||
|
VIR_FREE(cmd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
VIR_FREE(cmd);
|
||||||
|
|
||||||
|
/* If the command failed qemu prints: 'unknown command'
|
||||||
|
* No message is printed on success it seems */
|
||||||
|
DEBUG ("%s: balloon reply: %s", vm->def->name, reply);
|
||||||
|
if (strstr(reply, "\nunknown command:")) {
|
||||||
|
/* Don't set error - it is expected memory balloon fails on many qemu */
|
||||||
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_FREE(reply);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -78,5 +78,7 @@ int qemuMonitorGetBalloonInfo(const virDomainObjPtr vm,
|
|||||||
|
|
||||||
int qemuMonitorSetVNCPassword(const virDomainObjPtr vm,
|
int qemuMonitorSetVNCPassword(const virDomainObjPtr vm,
|
||||||
const char *password);
|
const char *password);
|
||||||
|
int qemuMonitorSetBalloon(const virDomainObjPtr vm,
|
||||||
|
unsigned long newmem);
|
||||||
|
|
||||||
#endif /* QEMU_MONITOR_TEXT_H */
|
#endif /* QEMU_MONITOR_TEXT_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user