From 82d72d9d235c341e0b32ed1a1eb5e544d3b3a895 Mon Sep 17 00:00:00 2001 From: Wenchao Xia Date: Tue, 24 Jun 2014 16:33:57 -0700 Subject: [PATCH 1/8] qapi: move event defines Signed-off-by: Wenchao Xia Reviewed-by: Eric Blake Signed-off-by: Luiz Capitulino --- Makefile | 2 +- qapi-schema.json | 5 +++-- qapi-event.json => qapi/event.json | 0 3 files changed, 4 insertions(+), 3 deletions(-) rename qapi-event.json => qapi/event.json (100%) diff --git a/Makefile b/Makefile index 145adb68a2..1eea0c418f 100644 --- a/Makefile +++ b/Makefile @@ -248,7 +248,7 @@ $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py) qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \ $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \ - $(SRC_PATH)/qapi-event.json + $(SRC_PATH)/qapi/event.json qapi-types.c qapi-types.h :\ $(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py) diff --git a/qapi-schema.json b/qapi-schema.json index e7727a1153..37c218994e 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -8,6 +8,9 @@ # QAPI block definitions { 'include': 'qapi/block.json' } +# QAPI event definitions +{ 'include': 'qapi/event.json' } + ## # LostTickPolicy: # @@ -3398,5 +3401,3 @@ ## { 'enum': 'GuestPanicAction', 'data': [ 'pause' ] } - -{ 'include': 'qapi-event.json' } diff --git a/qapi-event.json b/qapi/event.json similarity index 100% rename from qapi-event.json rename to qapi/event.json From 1dbbe04525d35b6888a6a89f97302306d06eafae Mon Sep 17 00:00:00 2001 From: Wenchao Xia Date: Tue, 24 Jun 2014 16:33:58 -0700 Subject: [PATCH 2/8] qapi: ignore generated event files Signed-off-by: Wenchao Xia Reviewed-by: Eric Blake Signed-off-by: Luiz Capitulino --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c658613560..2286d0a109 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ /qapi-generated /qapi-types.[ch] /qapi-visit.[ch] +/qapi-event.[ch] /qmp-commands.h /qmp-marshal.c /qemu-doc.html From d6f9c82c62023c1ed5af76847c55b0a663bdd2cc Mon Sep 17 00:00:00 2001 From: Wenchao Xia Date: Tue, 24 Jun 2014 16:33:59 -0700 Subject: [PATCH 3/8] qapi script: clean up in scripts This patch improve docs and uses c_type(argentry, is_param=True) in script. Signed-off-by: Wenchao Xia Reviewed-by: Eric Blake Signed-off-by: Luiz Capitulino --- docs/qapi-code-gen.txt | 8 ++++---- scripts/qapi-event.py | 5 ++--- scripts/qapi.py | 2 +- tests/qapi-schema/event-nest-struct.err | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt index 3a0c99e1da..a6197a9133 100644 --- a/docs/qapi-code-gen.txt +++ b/docs/qapi-code-gen.txt @@ -218,10 +218,10 @@ An example command is: === Events === Events are defined with the keyword 'event'. When 'data' is also specified, -additional info will be carried on. Finally there will be C API generated -in qapi-event.h; when called by QEMU code, a message with timestamp will -be emitted on the wire. If timestamp is -1, it means failure to retrieve host -time. +additional info will be included in the event. Finally there will be C API +generated in qapi-event.h; when called by QEMU code, a message with timestamp +will be emitted on the wire. If timestamp is -1, it means failure to retrieve +host time. An example event is: diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py index 3a1cd61914..601e3076ab 100644 --- a/scripts/qapi-event.py +++ b/scripts/qapi-event.py @@ -26,9 +26,8 @@ def _generate_event_api_name(event_name, params): api_name += "bool has_%s,\n" % c_var(argname) api_name += "".ljust(l) - if argentry == "str": - api_name += "const " - api_name += "%s %s,\n" % (c_type(argentry), c_var(argname)) + api_name += "%s %s,\n" % (c_type(argentry, is_param=True), + c_var(argname)) api_name += "".ljust(l) api_name += "Error **errp)" diff --git a/scripts/qapi.py b/scripts/qapi.py index 54b97cb48e..f2c6d1f840 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -255,7 +255,7 @@ def check_event(expr, expr_info): if structured: raise QAPIExprError(expr_info, "Nested structure define in event is not " - "supported now, event '%s', argname '%s'" + "supported, event '%s', argname '%s'" % (expr['event'], argname)) def check_union(expr, expr_info): diff --git a/tests/qapi-schema/event-nest-struct.err b/tests/qapi-schema/event-nest-struct.err index e4a0faac9c..91bde1c967 100644 --- a/tests/qapi-schema/event-nest-struct.err +++ b/tests/qapi-schema/event-nest-struct.err @@ -1 +1 @@ -tests/qapi-schema/event-nest-struct.json:1: Nested structure define in event is not supported now, event 'EVENT_A', argname 'a' +tests/qapi-schema/event-nest-struct.json:1: Nested structure define in event is not supported, event 'EVENT_A', argname 'a' From 2f44a08b3e2a42eb78dcb75657e007dffacba30d Mon Sep 17 00:00:00 2001 From: Wenchao Xia Date: Tue, 24 Jun 2014 16:34:00 -0700 Subject: [PATCH 4/8] qapi event: clean up in callers This patch improves docs and address small issues in event callers. Signed-off-by: Wenchao Xia Reviewed-by: Eric Blake Signed-off-by: Luiz Capitulino --- hw/watchdog/watchdog.c | 2 +- include/block/blockjob.h | 2 +- monitor.c | 2 +- qapi-schema.json | 7 ++++--- qapi/block-core.json | 3 ++- qapi/event.json | 4 ++-- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c index 4aebd34924..9f607d42bb 100644 --- a/hw/watchdog/watchdog.c +++ b/hw/watchdog/watchdog.c @@ -106,7 +106,7 @@ int select_watchdog_action(const char *p) */ void watchdog_perform_action(void) { - switch(watchdog_action) { + switch (watchdog_action) { case WDT_RESET: /* same as 'system_reset' in monitor */ qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_abort); qemu_system_reset_request(); diff --git a/include/block/blockjob.h b/include/block/blockjob.h index e443987ea8..cc765b50e6 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -217,7 +217,7 @@ void block_job_pause(BlockJob *job); void block_job_resume(BlockJob *job); /** - * block_job_event_cancle: + * block_job_event_cancelled: * @job: The job whose information is requested. * * Send a BLOCK_JOB_CANCELLED event for the specified job. diff --git a/monitor.c b/monitor.c index a8ab600c88..fd34ab705a 100644 --- a/monitor.c +++ b/monitor.c @@ -570,6 +570,7 @@ monitor_qapi_event_throttle(QAPIEvent event, int64_t rate) trace_monitor_protocol_event_throttle(event, rate); evstate->event = event; + assert(rate * SCALE_MS <= INT64_MAX); evstate->rate = rate * SCALE_MS; evstate->last = 0; evstate->data = NULL; @@ -585,7 +586,6 @@ static void monitor_qapi_event_init(void) monitor_qapi_event_throttle(QAPI_EVENT_RTC_CHANGE, 1000); monitor_qapi_event_throttle(QAPI_EVENT_WATCHDOG, 1000); monitor_qapi_event_throttle(QAPI_EVENT_BALLOON_CHANGE, 1000); - /* limit the rate of quorum events to avoid hammering the management */ monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_REPORT_BAD, 1000); monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_FAILURE, 1000); diff --git a/qapi-schema.json b/qapi-schema.json index 37c218994e..c68a17f4d8 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -657,8 +657,9 @@ # # @host: IP address # -# @service: The service name of vnc port. This may depend on the host system's -# service database so symbolic names should not be relied on. +# @service: The service name of the vnc port. This may depend on the host +# system's service database so symbolic names should not be relied +# on. # # @family: address family # @@ -697,7 +698,7 @@ ## { 'type': 'VncClientInfo', 'base': 'VncBasicInfo', - 'data': { '*x509_dname' : 'str', '*sasl_username': 'str' } } + 'data': { '*x509_dname': 'str', '*sasl_username': 'str' } } ## # @VncInfo: diff --git a/qapi/block-core.json b/qapi/block-core.json index af6b436540..925e53e944 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1436,7 +1436,8 @@ # @device: device name # # @msg: informative message for human consumption, such as the kind of -# corruption being detected +# corruption being detected. It should not be parsed by machine as it is +# not guaranteed to be stable # # @offset: #optional, if the corruption resulted from an image access, this is # the access offset into the image diff --git a/qapi/event.json b/qapi/event.json index e7a47f9927..8f817b18a1 100644 --- a/qapi/event.json +++ b/qapi/event.json @@ -1,8 +1,8 @@ ## # @SHUTDOWN # -# Emitted when the virtual machine has shutdown, possibly indicating that QEMU -# is about about to exit. +# Emitted when the virtual machine has shut down, indicating that qemu is +# about to exit. # # Note: If the command-line option "-no-shutdown" has been specified, qemu will # not exit, and a STOP event will eventually follow the SHUTDOWN event From dfab489214bcf88f1b81796118aaae3808620604 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Thu, 26 Jun 2014 09:33:47 -0400 Subject: [PATCH 5/8] qmp: add qmp-events.txt back The conversion of events to the QAPI, resulted in the removal of the docs/qmp/qmp-events.txt file. This was done to avoid having duplicated information between qmp-events.txt and qapi-event.json. However, qmp-events.txt contains examples and we're still not sure how to proper install QAPI docs in the host. To avoid harming users, it's better to re-add qmp-events.txt for now and deal with the duplication later. Signed-off-by: Luiz Capitulino Reviewed-by: Paolo Bonzini Reviewed-by: Eric Blake --- docs/qmp/qmp-events.txt | 551 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 551 insertions(+) create mode 100644 docs/qmp/qmp-events.txt diff --git a/docs/qmp/qmp-events.txt b/docs/qmp/qmp-events.txt new file mode 100644 index 0000000000..22fea580a9 --- /dev/null +++ b/docs/qmp/qmp-events.txt @@ -0,0 +1,551 @@ + QEMU Machine Protocol Events + ============================ + +ACPI_DEVICE_OST +--------------- + +Emitted when guest executes ACPI _OST method. + + - data: ACPIOSTInfo type as described in qapi-schema.json + +{ "event": "ACPI_DEVICE_OST", + "data": { "device": "d1", "slot": "0", "slot-type": "DIMM", "source": 1, "status": 0 } } + +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 } } + +BLOCK_IMAGE_CORRUPTED +--------------------- + +Emitted when a disk image is being marked corrupt. + +Data: + +- "device": Device name (json-string) +- "msg": Informative message (e.g., reason for the corruption) (json-string) +- "offset": If the corruption resulted from an image access, this is the access + offset into the image (json-int) +- "size": If the corruption resulted from an image access, this is the access + size (json-int) + +Example: + +{ "event": "BLOCK_IMAGE_CORRUPTED", + "data": { "device": "ide0-hd0", + "msg": "Prevented active L1 table overwrite", "offset": 196608, + "size": 65536 }, + "timestamp": { "seconds": 1378126126, "microseconds": 966463 } } + +BLOCK_IO_ERROR +-------------- + +Emitted when a disk I/O error occurs. + +Data: + +- "device": device name (json-string) +- "operation": I/O operation (json-string, "read" or "write") +- "action": action that has been taken, it's one of the following (json-string): + "ignore": error has been ignored + "report": error has been reported to the device + "stop": the VM is going to stop because of the error + +Example: + +{ "event": "BLOCK_IO_ERROR", + "data": { "device": "ide0-hd1", + "operation": "write", + "action": "stop" }, + "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } + +Note: If action is "stop", a STOP event will eventually follow the +BLOCK_IO_ERROR event. + +BLOCK_JOB_CANCELLED +------------------- + +Emitted when a block job has been cancelled. + +Data: + +- "type": Job type (json-string; "stream" for image streaming + "commit" for block commit) +- "device": Device name (json-string) +- "len": Maximum progress value (json-int) +- "offset": Current progress value (json-int) + On success this is equal to len. + On failure this is less than len. +- "speed": Rate limit, bytes per second (json-int) + +Example: + +{ "event": "BLOCK_JOB_CANCELLED", + "data": { "type": "stream", "device": "virtio-disk0", + "len": 10737418240, "offset": 134217728, + "speed": 0 }, + "timestamp": { "seconds": 1267061043, "microseconds": 959568 } } + +BLOCK_JOB_COMPLETED +------------------- + +Emitted when a block job has completed. + +Data: + +- "type": Job type (json-string; "stream" for image streaming + "commit" for block commit) +- "device": Device name (json-string) +- "len": Maximum progress value (json-int) +- "offset": Current progress value (json-int) + On success this is equal to len. + On failure this is less than len. +- "speed": Rate limit, bytes per second (json-int) +- "error": Error message (json-string, optional) + Only present on failure. This field contains a human-readable + error message. There are no semantics other than that streaming + has failed and clients should not try to interpret the error + string. + +Example: + +{ "event": "BLOCK_JOB_COMPLETED", + "data": { "type": "stream", "device": "virtio-disk0", + "len": 10737418240, "offset": 10737418240, + "speed": 0 }, + "timestamp": { "seconds": 1267061043, "microseconds": 959568 } } + +BLOCK_JOB_ERROR +--------------- + +Emitted when a block job encounters an error. + +Data: + +- "device": device name (json-string) +- "operation": I/O operation (json-string, "read" or "write") +- "action": action that has been taken, it's one of the following (json-string): + "ignore": error has been ignored, the job may fail later + "report": error will be reported and the job canceled + "stop": error caused job to be paused + +Example: + +{ "event": "BLOCK_JOB_ERROR", + "data": { "device": "ide0-hd1", + "operation": "write", + "action": "stop" }, + "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } + +BLOCK_JOB_READY +--------------- + +Emitted when a block job is ready to complete. + +Data: + +- "device": device name (json-string) + +Example: + +{ "event": "BLOCK_JOB_READY", + "data": { "device": "ide0-hd1" }, + "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } + +Note: The "ready to complete" status is always reset by a BLOCK_JOB_ERROR +event. + +DEVICE_DELETED +-------------- + +Emitted whenever the device removal completion is acknowledged +by the guest. +At this point, it's safe to reuse the specified device ID. +Device removal can be initiated by the guest or by HMP/QMP commands. + +Data: + +- "device": device name (json-string, optional) +- "path": device path (json-string) + +{ "event": "DEVICE_DELETED", + "data": { "device": "virtio-net-pci-0", + "path": "/machine/peripheral/virtio-net-pci-0" }, + "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } + +DEVICE_TRAY_MOVED +----------------- + +It's emitted whenever the tray of a removable device is moved by the guest +or by HMP/QMP commands. + +Data: + +- "device": device name (json-string) +- "tray-open": true if the tray has been opened or false if it has been closed + (json-bool) + +{ "event": "DEVICE_TRAY_MOVED", + "data": { "device": "ide1-cd0", + "tray-open": true + }, + "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } + +GUEST_PANICKED +-------------- + +Emitted when guest OS panic is detected. + +Data: + +- "action": Action that has been taken (json-string, currently always "pause"). + +Example: + +{ "event": "GUEST_PANICKED", + "data": { "action": "pause" } } + +NIC_RX_FILTER_CHANGED +--------------------- + +The event is emitted once until the query command is executed, +the first event will always be emitted. + +Data: + +- "name": net client name (json-string) +- "path": device path (json-string) + +{ "event": "NIC_RX_FILTER_CHANGED", + "data": { "name": "vnet0", + "path": "/machine/peripheral/vnet0/virtio-backend" }, + "timestamp": { "seconds": 1368697518, "microseconds": 326866 } } +} + +QUORUM_FAILURE +-------------- + +Emitted by the Quorum block driver if it fails to establish a quorum. + +Data: + +- "reference": device name if defined else node name. +- "sector-num": Number of the first sector of the failed read operation. +- "sector-count": Failed read operation sector count. + +Example: + +{ "event": "QUORUM_FAILURE", + "data": { "reference": "usr1", "sector-num": 345435, "sector-count": 5 }, + "timestamp": { "seconds": 1344522075, "microseconds": 745528 } } + +QUORUM_REPORT_BAD +----------------- + +Emitted to report a corruption of a Quorum file. + +Data: + +- "error": Error message (json-string, optional) + Only present on failure. This field contains a human-readable + error message. There are no semantics other than that the + block layer reported an error and clients should not try to + interpret the error string. +- "node-name": The graph node name of the block driver state. +- "sector-num": Number of the first sector of the failed read operation. +- "sector-count": Failed read operation sector count. + +Example: + +{ "event": "QUORUM_REPORT_BAD", + "data": { "node-name": "1.raw", "sector-num": 345435, "sector-count": 5 }, + "timestamp": { "seconds": 1344522075, "microseconds": 745528 } } + +RESET +----- + +Emitted when the Virtual Machine is reseted. + +Data: None. + +Example: + +{ "event": "RESET", + "timestamp": { "seconds": 1267041653, "microseconds": 9518 } } + +RESUME +------ + +Emitted when the Virtual Machine resumes execution. + +Data: None. + +Example: + +{ "event": "RESUME", + "timestamp": { "seconds": 1271770767, "microseconds": 582542 } } + +RTC_CHANGE +---------- + +Emitted when the guest changes the RTC time. + +Data: + +- "offset": Offset between base RTC clock (as specified by -rtc base), and +new RTC clock value (json-number) + +Example: + +{ "event": "RTC_CHANGE", + "data": { "offset": 78 }, + "timestamp": { "seconds": 1267020223, "microseconds": 435656 } } + +SHUTDOWN +-------- + +Emitted when the Virtual Machine is powered down. + +Data: None. + +Example: + +{ "event": "SHUTDOWN", + "timestamp": { "seconds": 1267040730, "microseconds": 682951 } } + +Note: If the command-line option "-no-shutdown" has been specified, a STOP +event will eventually follow the SHUTDOWN event. + +SPICE_CONNECTED, SPICE_DISCONNECTED +----------------------------------- + +Emitted when a SPICE client connects or disconnects. + +Data: + +- "server": Server information (json-object) + - "host": IP address (json-string) + - "port": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") +- "client": Client information (json-object) + - "host": IP address (json-string) + - "port": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + +Example: + +{ "timestamp": {"seconds": 1290688046, "microseconds": 388707}, + "event": "SPICE_CONNECTED", + "data": { + "server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"}, + "client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"} +}} + +SPICE_INITIALIZED +----------------- + +Emitted after initial handshake and authentication takes place (if any) +and the SPICE channel is up'n'running + +Data: + +- "server": Server information (json-object) + - "host": IP address (json-string) + - "port": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + - "auth": authentication method (json-string, optional) +- "client": Client information (json-object) + - "host": IP address (json-string) + - "port": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + - "connection-id": spice connection id. All channels with the same id + belong to the same spice session (json-int) + - "channel-type": channel type. "1" is the main control channel, filter for + this one if you want track spice sessions only (json-int) + - "channel-id": channel id. Usually "0", might be different needed when + multiple channels of the same type exist, such as multiple + display channels in a multihead setup (json-int) + - "tls": whevener the channel is encrypted (json-bool) + +Example: + +{ "timestamp": {"seconds": 1290688046, "microseconds": 417172}, + "event": "SPICE_INITIALIZED", + "data": {"server": {"auth": "spice", "port": "5921", + "family": "ipv4", "host": "127.0.0.1"}, + "client": {"port": "49004", "family": "ipv4", "channel-type": 3, + "connection-id": 1804289383, "host": "127.0.0.1", + "channel-id": 0, "tls": true} +}} + +STOP +---- + +Emitted when the Virtual Machine is stopped. + +Data: None. + +Example: + +{ "event": "STOP", + "timestamp": { "seconds": 1267041730, "microseconds": 281295 } } + +SUSPEND +------- + +Emitted when guest enters S3 state. + +Data: None. + +Example: + +{ "event": "SUSPEND", + "timestamp": { "seconds": 1344456160, "microseconds": 309119 } } + +SUSPEND_DISK +------------ + +Emitted when the guest makes a request to enter S4 state. + +Data: None. + +Example: + +{ "event": "SUSPEND_DISK", + "timestamp": { "seconds": 1344456160, "microseconds": 309119 } } + +Note: QEMU shuts down when entering S4 state. + +VNC_CONNECTED +------------- + +Emitted when a VNC client establishes a connection. + +Data: + +- "server": Server information (json-object) + - "host": IP address (json-string) + - "service": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + - "auth": authentication method (json-string, optional) +- "client": Client information (json-object) + - "host": IP address (json-string) + - "service": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + +Example: + +{ "event": "VNC_CONNECTED", + "data": { + "server": { "auth": "sasl", "family": "ipv4", + "service": "5901", "host": "0.0.0.0" }, + "client": { "family": "ipv4", "service": "58425", + "host": "127.0.0.1" } }, + "timestamp": { "seconds": 1262976601, "microseconds": 975795 } } + + +Note: This event is emitted before any authentication takes place, thus +the authentication ID is not provided. + +VNC_DISCONNECTED +---------------- + +Emitted when the connection is closed. + +Data: + +- "server": Server information (json-object) + - "host": IP address (json-string) + - "service": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + - "auth": authentication method (json-string, optional) +- "client": Client information (json-object) + - "host": IP address (json-string) + - "service": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + - "x509_dname": TLS dname (json-string, optional) + - "sasl_username": SASL username (json-string, optional) + +Example: + +{ "event": "VNC_DISCONNECTED", + "data": { + "server": { "auth": "sasl", "family": "ipv4", + "service": "5901", "host": "0.0.0.0" }, + "client": { "family": "ipv4", "service": "58425", + "host": "127.0.0.1", "sasl_username": "luiz" } }, + "timestamp": { "seconds": 1262976601, "microseconds": 975795 } } + +VNC_INITIALIZED +--------------- + +Emitted after authentication takes place (if any) and the VNC session is +made active. + +Data: + +- "server": Server information (json-object) + - "host": IP address (json-string) + - "service": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + - "auth": authentication method (json-string, optional) +- "client": Client information (json-object) + - "host": IP address (json-string) + - "service": port number (json-string) + - "family": address family (json-string, "ipv4" or "ipv6") + - "x509_dname": TLS dname (json-string, optional) + - "sasl_username": SASL username (json-string, optional) + +Example: + +{ "event": "VNC_INITIALIZED", + "data": { + "server": { "auth": "sasl", "family": "ipv4", + "service": "5901", "host": "0.0.0.0"}, + "client": { "family": "ipv4", "service": "46089", + "host": "127.0.0.1", "sasl_username": "luiz" } }, + "timestamp": { "seconds": 1263475302, "microseconds": 150772 } } + +WAKEUP +------ + +Emitted when the guest has woken up from S3 and is running. + +Data: None. + +Example: + +{ "event": "WAKEUP", + "timestamp": { "seconds": 1344522075, "microseconds": 745528 } } + +WATCHDOG +-------- + +Emitted when the watchdog device's timer is expired. + +Data: + +- "action": Action that has been taken, it's one of the following (json-string): + "reset", "shutdown", "poweroff", "pause", "debug", or "none" + +Example: + +{ "event": "WATCHDOG", + "data": { "action": "reset" }, + "timestamp": { "seconds": 1267061043, "microseconds": 959568 } } + +Note: If action is "reset", "shutdown", or "pause" the WATCHDOG event is +followed respectively by the RESET, SHUTDOWN, or STOP events. From e2ae6159de2482ee5e22532301eb7f2795828d07 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 26 Jun 2014 17:50:02 +0200 Subject: [PATCH 6/8] virtio-serial: report frontend connection state via monitor 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 --- hw/char/virtio-console.c | 12 +++++++++--- monitor.c | 1 + qapi/event.json | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index 6c8be0fe26..54eb15f3af 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -14,6 +14,7 @@ #include "qemu/error-report.h" #include "trace.h" #include "hw/virtio/virtio-serial.h" +#include "qapi-event.h" #define TYPE_VIRTIO_CONSOLE_SERIAL_PORT "virtserialport" #define VIRTIO_CONSOLE(obj) \ @@ -81,11 +82,16 @@ static ssize_t flush_buf(VirtIOSerialPort *port, static void set_guest_connected(VirtIOSerialPort *port, int guest_connected) { VirtConsole *vcon = VIRTIO_CONSOLE(port); + DeviceState *dev = DEVICE(port); - if (!vcon->chr) { - return; + if (vcon->chr) { + qemu_chr_fe_set_open(vcon->chr, guest_connected); + } + + if (dev->id) { + qapi_event_send_vserport_change(dev->id, guest_connected, + &error_abort); } - qemu_chr_fe_set_open(vcon->chr, guest_connected); } /* Readiness of the guest to accept data on a port */ diff --git a/monitor.c b/monitor.c index fd34ab705a..5718d0b60a 100644 --- a/monitor.c +++ b/monitor.c @@ -588,6 +588,7 @@ static void monitor_qapi_event_init(void) monitor_qapi_event_throttle(QAPI_EVENT_BALLOON_CHANGE, 1000); monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_REPORT_BAD, 1000); monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_FAILURE, 1000); + monitor_qapi_event_throttle(QAPI_EVENT_VSERPORT_CHANGE, 1000); qmp_event_set_func_emit(monitor_qapi_event_queue); } diff --git a/qapi/event.json b/qapi/event.json index 8f817b18a1..ff97aeb377 100644 --- a/qapi/event.json +++ b/qapi/event.json @@ -316,3 +316,17 @@ { 'event': 'QUORUM_REPORT_BAD', 'data': { '*error': 'str', 'node-name': 'str', 'sector-num': 'int', 'sector-count': 'int' } } + +## +# @VSERPORT_CHANGE +# +# Emitted when the guest opens or closes a virtio-serial port. +# +# @id: device identifier of the virtio-serial port +# +# @open: true if the guest has opened the virtio-serial port +# +# Since: 2.1 +## +{ 'event': 'VSERPORT_CHANGE', + 'data': { 'id': 'str', 'open': 'bool' } } From 32a97ea1711f43388e178b7c43e02143a61e47ee Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 26 Jun 2014 17:50:03 +0200 Subject: [PATCH 7/8] char: report frontend open/closed state in 'query-chardev' In addition to the on-line reporting added in the previous patch, allow libvirt to query frontend state independently of events. Libvirt's path to identify the guest agent channel it cares about differs between the event added in the previous patch and the QMP response field added here. The event identifies the frontend device, by "id". The 'query-chardev' QMP command identifies the backend device (again by "id"). The association is under libvirt's control. RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376 Reviewed-by: Amit Shah Signed-off-by: Laszlo Ersek Reviewed-by: Eric Blake Signed-off-by: Luiz Capitulino --- qapi-schema.json | 8 +++++++- qemu-char.c | 1 + qmp-commands.hx | 19 ++++++++++++++----- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index c68a17f4d8..2284f0f12a 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -214,12 +214,18 @@ # # @filename: the filename of the character device # +# @frontend-open: shows whether the frontend device attached to this backend +# (eg. with the chardev=... option) is in open or closed state +# (since 2.1) +# # Notes: @filename is encoded using the QEMU command line character device # encoding. See the QEMU man page for details. # # Since: 0.14.0 ## -{ 'type': 'ChardevInfo', 'data': {'label': 'str', 'filename': 'str'} } +{ 'type': 'ChardevInfo', 'data': {'label': 'str', + 'filename': 'str', + 'frontend-open': 'bool'} } ## # @query-chardev: diff --git a/qemu-char.c b/qemu-char.c index cbd6b9a025..51917de462 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -3705,6 +3705,7 @@ ChardevInfoList *qmp_query_chardev(Error **errp) info->value = g_malloc0(sizeof(*info->value)); info->value->label = g_strdup(chr->label); info->value->filename = g_strdup(chr->filename); + info->value->frontend_open = chr->fe_open; info->next = chr_list; chr_list = info; diff --git a/qmp-commands.hx b/qmp-commands.hx index e4a1c80434..35f51466fb 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -1921,19 +1921,28 @@ Each json-object contain the following: - "label": device's label (json-string) - "filename": device's file (json-string) +- "frontend-open": open/closed state of the frontend device attached to this + backend (json-bool) Example: -> { "execute": "query-chardev" } <- { - "return":[ + "return": [ { - "label":"monitor", - "filename":"stdio" + "label": "charchannel0", + "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server", + "frontend-open": false }, { - "label":"serial0", - "filename":"vc" + "label": "charmonitor", + "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server", + "frontend-open": true + }, + { + "label": "charserial0", + "filename": "pty:/dev/pts/2", + "frontend-open": true } ] } From a22d8e47f7efb15a96162b92b50f8fb108b1c5d9 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 27 Jun 2014 19:24:15 +0200 Subject: [PATCH 8/8] docs/qmp: Fix documentation of BLOCK_JOB_READY to match code Signed-off-by: Markus Armbruster Signed-off-by: Luiz Capitulino --- docs/qmp/qmp-events.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/qmp/qmp-events.txt b/docs/qmp/qmp-events.txt index 22fea580a9..44be891261 100644 --- a/docs/qmp/qmp-events.txt +++ b/docs/qmp/qmp-events.txt @@ -157,12 +157,20 @@ Emitted when a block job is ready to complete. Data: -- "device": device name (json-string) +- "type": Job type (json-string; "stream" for image streaming + "commit" for block commit) +- "device": Device name (json-string) +- "len": Maximum progress value (json-int) +- "offset": Current progress value (json-int) + On success this is equal to len. + On failure this is less than len. +- "speed": Rate limit, bytes per second (json-int) Example: { "event": "BLOCK_JOB_READY", - "data": { "device": "ide0-hd1" }, + "data": { "device": "drive0", "type": "mirror", "speed": 0, + "len": 2097152, "offset": 2097152 } "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } Note: The "ready to complete" status is always reset by a BLOCK_JOB_ERROR