From b9295fa6535d7092f9234e63ed6b5670bd862d0c Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Tue, 22 Jul 2014 18:31:22 +0200 Subject: [PATCH 02/11] virtio-serial: report frontend connection state via monitor Message-id: <1406053883-21237-2-git-send-email-lersek@redhat.com> Patchwork-id: 60229 O-Subject: [RHEL-7.1 qemu-kvm PATCH 1/2] virtio-serial: report frontend connection state via monitor Bugzilla: 1122151 RH-Acked-by: Luiz Capitulino RH-Acked-by: Amit Shah RH-Acked-by: Eric Blake Libvirt wants to know about the guest-side connection state of some virtio-serial ports (in particular the one(s) assigned to guest agent(s)). Report such states with a new monitor event. RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376 Signed-off-by: Laszlo Ersek Reviewed-by: Eric Blake Reviewed-by: Amit Shah Signed-off-by: Luiz Capitulino RHEL-7 notes: manual reimplementation of upstream commit e2ae6159de2482ee5e22532301eb7f2795828d07, because we don't have Wenchao Xia's qapi-event series. Signed-off-by: Laszlo Ersek --- include/monitor/monitor.h | 1 + hw/char/virtio-console.c | 17 ++++++++++++++--- monitor.c | 2 ++ QMP/qmp-events.txt | 16 ++++++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) Signed-off-by: Miroslav Rezanina --- QMP/qmp-events.txt | 16 ++++++++++++++++ hw/char/virtio-console.c | 17 ++++++++++++++--- include/monitor/monitor.h | 1 + monitor.c | 2 ++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt index fc4b7db..ec4e4b9 100644 --- a/QMP/qmp-events.txt +++ b/QMP/qmp-events.txt @@ -485,6 +485,22 @@ Example: "host": "127.0.0.1", "sasl_username": "luiz" } }, "timestamp": { "seconds": 1263475302, "microseconds": 150772 } } +VSERPORT_CHANGE +--------------- + +Emitted when the guest opens or closes a virtio-serial port. + +Data: + +- "id": device identifier of the virtio-serial port (json-string) +- "open": true if the guest has opened the virtio-serial port (json-bool) + +Example: + +{ "event": "VSERPORT_CHANGE", + "data": { "id": "channel0", "open": true }, + "timestamp": { "seconds": 1401385907, "microseconds": 422329 } } + WAKEUP ------ diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index 2e00ad2..1b01dcd 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -14,6 +14,8 @@ #include "qemu/error-report.h" #include "trace.h" #include "hw/virtio/virtio-serial.h" +#include "monitor/monitor.h" +#include "qapi/qmp/qjson.h" typedef struct VirtConsole { VirtIOSerialPort port; @@ -76,11 +78,20 @@ static ssize_t flush_buf(VirtIOSerialPort *port, static void set_guest_connected(VirtIOSerialPort *port, int guest_connected) { VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); + DeviceState *dev = DEVICE(port); - if (!vcon->chr) { - return; + if (vcon->chr) { + qemu_chr_fe_set_open(vcon->chr, guest_connected); } - qemu_chr_fe_set_open(vcon->chr, guest_connected); + + if (dev->id) { + QObject *data; + + data = qobject_from_jsonf("{ 'id': %s, 'open': %i }", + dev->id, guest_connected); + monitor_protocol_event(QEVENT_VSERPORT_CHANGE, data); + qobject_decref(data); + } } /* Readiness of the guest to accept data on a port */ diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index dcce609..6c128e9 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -52,6 +52,7 @@ typedef enum MonitorEvent { QEVENT_SPICE_MIGRATE_COMPLETED, QEVENT_GUEST_PANICKED, QEVENT_BLOCK_IMAGE_CORRUPTED, + QEVENT_VSERPORT_CHANGE, /* Add to 'monitor_event_names' array in monitor.c when * defining new events here */ diff --git a/monitor.c b/monitor.c index a6abfb5..798885d 100644 --- a/monitor.c +++ b/monitor.c @@ -506,6 +506,7 @@ static const char *monitor_event_names[] = { [QEVENT_SPICE_MIGRATE_COMPLETED] = "SPICE_MIGRATE_COMPLETED", [QEVENT_GUEST_PANICKED] = "GUEST_PANICKED", [QEVENT_BLOCK_IMAGE_CORRUPTED] = "BLOCK_IMAGE_CORRUPTED", + [QEVENT_VSERPORT_CHANGE] = "VSERPORT_CHANGE", }; QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX) @@ -642,6 +643,7 @@ static void monitor_protocol_event_init(void) monitor_protocol_event_throttle(QEVENT_RTC_CHANGE, 1000); monitor_protocol_event_throttle(QEVENT_BALLOON_CHANGE, 1000); monitor_protocol_event_throttle(QEVENT_WATCHDOG, 1000); + monitor_protocol_event_throttle(QEVENT_VSERPORT_CHANGE, 1000); } /** -- 1.7.1