Add event notification for guest balloon changes
After setting a balloon target value, applications have to continually poll 'query-balloon' to determine whether the guest has reacted to this request. The virtio-balloon backend knows exactly when the guest has reacted though, and thus it is possible to emit a JSON event to tell the mgmt application whenever the guest balloon changes. This introduces a new 'qemu_balloon_changed()' API which is to be called by balloon driver backends, whenever they have a change in balloon value. This takes the 'actual' balloon value, as would be found in the BalloonInfo struct. The qemu_balloon_change API emits a JSON monitor event which looks like: {"timestamp": {"seconds": 1337162462, "microseconds": 814521}, "event": "BALLOON_CHANGE", "data": {"actual": 944766976}} * balloon.c, balloon.h: Introduce qemu_balloon_changed() for emitting balloon change events on the monitor * hw/virtio-balloon.c: Invoke qemu_balloon_changed() whenever the guest changes the balloon actual value * monitor.c, monitor.h: Define QEVENT_BALLOON_CHANGE Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Acked-by: Amit Shah <amit.shah@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
395c3b80bb
commit
973603a813
|
@ -335,3 +335,21 @@ Example:
|
||||||
"len": 10737418240, "offset": 134217728,
|
"len": 10737418240, "offset": 134217728,
|
||||||
"speed": 0 },
|
"speed": 0 },
|
||||||
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
||||||
|
|
||||||
|
|
||||||
|
BALLOON_CHANGE
|
||||||
|
----------
|
||||||
|
|
||||||
|
Emitted when the guest changes the actual BALLOON level. This
|
||||||
|
value is equivalent to the 'actual' field return by the
|
||||||
|
'query-balloon' command
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "actual": actual level of the guest memory balloon in bytes (json-number)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BALLOON_CHANGE",
|
||||||
|
"data": { "actual": 944766976 },
|
||||||
|
"timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
|
||||||
|
|
14
balloon.c
14
balloon.c
|
@ -30,6 +30,7 @@
|
||||||
#include "balloon.h"
|
#include "balloon.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
|
#include "qjson.h"
|
||||||
|
|
||||||
static QEMUBalloonEvent *balloon_event_fn;
|
static QEMUBalloonEvent *balloon_event_fn;
|
||||||
static QEMUBalloonStatus *balloon_stat_fn;
|
static QEMUBalloonStatus *balloon_stat_fn;
|
||||||
|
@ -80,6 +81,19 @@ static int qemu_balloon_status(BalloonInfo *info)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_balloon_changed(int64_t actual)
|
||||||
|
{
|
||||||
|
QObject *data;
|
||||||
|
|
||||||
|
data = qobject_from_jsonf("{ 'actual': %" PRId64 " }",
|
||||||
|
actual);
|
||||||
|
|
||||||
|
monitor_protocol_event(QEVENT_BALLOON_CHANGE, data);
|
||||||
|
|
||||||
|
qobject_decref(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BalloonInfo *qmp_query_balloon(Error **errp)
|
BalloonInfo *qmp_query_balloon(Error **errp)
|
||||||
{
|
{
|
||||||
BalloonInfo *info;
|
BalloonInfo *info;
|
||||||
|
|
|
@ -24,4 +24,6 @@ int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
|
||||||
QEMUBalloonStatus *stat_func, void *opaque);
|
QEMUBalloonStatus *stat_func, void *opaque);
|
||||||
void qemu_remove_balloon_handler(void *opaque);
|
void qemu_remove_balloon_handler(void *opaque);
|
||||||
|
|
||||||
|
void qemu_balloon_changed(int64_t actual);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -146,8 +146,13 @@ static void virtio_balloon_set_config(VirtIODevice *vdev,
|
||||||
{
|
{
|
||||||
VirtIOBalloon *dev = to_virtio_balloon(vdev);
|
VirtIOBalloon *dev = to_virtio_balloon(vdev);
|
||||||
struct virtio_balloon_config config;
|
struct virtio_balloon_config config;
|
||||||
|
uint32_t oldactual = dev->actual;
|
||||||
memcpy(&config, config_data, 8);
|
memcpy(&config, config_data, 8);
|
||||||
dev->actual = le32_to_cpu(config.actual);
|
dev->actual = le32_to_cpu(config.actual);
|
||||||
|
if (dev->actual != oldactual) {
|
||||||
|
qemu_balloon_changed(ram_size -
|
||||||
|
(dev->actual << VIRTIO_BALLOON_PFN_SHIFT));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t virtio_balloon_get_features(VirtIODevice *vdev, uint32_t f)
|
static uint32_t virtio_balloon_get_features(VirtIODevice *vdev, uint32_t f)
|
||||||
|
|
|
@ -443,6 +443,7 @@ static const char *monitor_event_names[] = {
|
||||||
[QEVENT_DEVICE_TRAY_MOVED] = "DEVICE_TRAY_MOVED",
|
[QEVENT_DEVICE_TRAY_MOVED] = "DEVICE_TRAY_MOVED",
|
||||||
[QEVENT_SUSPEND] = "SUSPEND",
|
[QEVENT_SUSPEND] = "SUSPEND",
|
||||||
[QEVENT_WAKEUP] = "WAKEUP",
|
[QEVENT_WAKEUP] = "WAKEUP",
|
||||||
|
[QEVENT_BALLOON_CHANGE] = "BALLOON_CHANGE",
|
||||||
};
|
};
|
||||||
QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
|
QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ typedef enum MonitorEvent {
|
||||||
QEVENT_DEVICE_TRAY_MOVED,
|
QEVENT_DEVICE_TRAY_MOVED,
|
||||||
QEVENT_SUSPEND,
|
QEVENT_SUSPEND,
|
||||||
QEVENT_WAKEUP,
|
QEVENT_WAKEUP,
|
||||||
|
QEVENT_BALLOON_CHANGE,
|
||||||
|
|
||||||
/* Add to 'monitor_event_names' array in monitor.c when
|
/* Add to 'monitor_event_names' array in monitor.c when
|
||||||
* defining new events here */
|
* defining new events here */
|
||||||
|
|
Loading…
Reference in New Issue