diff --git a/monitor.c b/monitor.c index 22360fce3034cfc66783f00c2c840ea9b0038fb4..a928c3eb0de255e6332a072976ba3245d4d9c383 100644 --- a/monitor.c +++ b/monitor.c @@ -34,6 +34,7 @@ #include "block.h" #include "audio/audio.h" #include "disas.h" +#include "balloon.h" #include #include "qemu-timer.h" #include "migration.h" @@ -1390,6 +1391,23 @@ static void do_inject_nmi(int cpu_index) } #endif +static void do_balloon(int value) +{ + ram_addr_t target = value; + qemu_balloon(target << 20); +} + +static void do_info_balloon(void) +{ + ram_addr_t actual; + + actual = qemu_balloon_status(); + if (actual == 0) + term_printf("Ballooning not activated in VM\n"); + else + term_printf("balloon: actual=%d\n", (int)(actual >> 20)); +} + static const term_cmd_t term_cmds[] = { { "help|?", "s?", do_help, "[cmd]", "show the help" }, @@ -1475,6 +1493,8 @@ static const term_cmd_t term_cmds[] = { "", "cancel the current VM migration" }, { "migrate_set_speed", "s", do_migrate_set_speed, "value", "set maximum speed (in bytes) for migrations" }, + { "balloon", "i", do_balloon, + "target", "request VM to change it's memory allocation (in MB)" }, { NULL, NULL, }, }; @@ -1542,6 +1562,8 @@ static const term_cmd_t info_cmds[] = { "", "show SLIRP statistics", }, #endif { "migrate", "", do_info_migrate, "", "show migration status" }, + { "balloon", "", do_info_balloon, + "", "show balloon information" }, { NULL, NULL, }, }; diff --git a/vl.c b/vl.c index 2b5366e7ec684de303c9485249e2e171f619cc99..1cee2a793f4ea909d2db04ec4062115d51dabe79 100644 --- a/vl.c +++ b/vl.c @@ -40,6 +40,7 @@ #include "audio/audio.h" #include "migration.h" #include "kvm.h" +#include "balloon.h" #include #include @@ -514,6 +515,31 @@ void hw_error(const char *fmt, ...) va_end(ap); abort(); } + +/***************/ +/* ballooning */ + +static QEMUBalloonEvent *qemu_balloon_event; +void *qemu_balloon_event_opaque; + +void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque) +{ + qemu_balloon_event = func; + qemu_balloon_event_opaque = opaque; +} + +void qemu_balloon(ram_addr_t target) +{ + if (qemu_balloon_event) + qemu_balloon_event(qemu_balloon_event_opaque, target); +} + +ram_addr_t qemu_balloon_status(void) +{ + if (qemu_balloon_event) + return qemu_balloon_event(qemu_balloon_event_opaque, 0); + return 0; +} /***********************************************************/ /* keyboard/mouse */