2bd3bce8ef
With virtio-blk dataplane, I/O errors might occur while QEMU is not in the main I/O thread. However, it's invalid to call vm_stop when we're neither in a VCPU thread nor in the main I/O thread, even if we were to take the iothread mutex around it. To avoid this problem, we can raise a request to the main I/O thread, similar to what QEMU does when vm_stop is called from a CPU thread. We know that bdrv_error_action is called from an AIO callback, and the moment at which the callback will fire is not well-defined; it depends on the moment at which the disk or OS finishes the operation, which can happen at any time. Note that QEMU is certainly not in a CPU thread and we do not need to call cpu_stop_current() like vm_stop() does. However, we need to ensure that any action taken by management will result in correct detection of the error _and_ a running VM. In particular: - the event must be raised after the iostatus has been set, so that "info block" will return an iostatus that matches the event. - the VM must be stopped after the iostatus has been set, so that "info block" will return an iostatus that matches the runstate. The ordering between the STOP and BLOCK_IO_ERROR events is preserved; BLOCK_IO_ERROR is documented to come first. This makes bdrv_error_action() thread safe (assuming QMP events are, which is attacked by a separate series). Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> |
||
---|---|---|
.. | ||
qmp-events.txt | ||
qmp-spec.txt | ||
README |
QEMU Machine Protocol ===================== Introduction ------------ The QEMU Machine Protocol (QMP) allows applications to operate a QEMU instance. QMP is JSON[1] based and features the following: - Lightweight, text-based, easy to parse data format - Asynchronous messages support (ie. events) - Capabilities Negotiation For detailed information on QMP's usage, please, refer to the following files: o qmp-spec.txt QEMU Machine Protocol current specification o qmp-commands.txt QMP supported commands (auto-generated at build-time) o qmp-events.txt List of available asynchronous events [1] http://www.json.org Usage ----- You can use the -qmp option to enable QMP. For example, the following makes QMP available on localhost port 4444: $ qemu [...] -qmp tcp:localhost:4444,server,nowait However, for more flexibility and to make use of more options, the -mon command-line option should be used. For instance, the following example creates one HMP instance (human monitor) on stdio and one QMP instance on localhost port 4444: $ qemu [...] -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline \ -chardev socket,id=mon1,host=localhost,port=4444,server,nowait \ -mon chardev=mon1,mode=control,pretty=on Please, refer to QEMU's manpage for more information. Simple Testing -------------- To manually test QMP one can connect with telnet and issue commands by hand: $ telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. { "QMP": { "version": { "qemu": { "micro": 50, "minor": 6, "major": 1 }, "package": "" }, "capabilities": [ ] } } { "execute": "qmp_capabilities" } { "return": { } } { "execute": "query-status" } { "return": { "status": "prelaunch", "singlestep": false, "running": false } } Please, refer to the qapi-schema.json file for a complete command reference. QMP wiki page ------------- http://wiki.qemu-project.org/QMP