qemu/stubs
Paolo Bonzini 2bd3bce8ef block: asynchronously stop the VM on I/O errors
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>
2014-06-23 16:36:13 +08:00
..
arch-query-cpu-def.c qerror.h: Replace QERR_NOT_SUPPORTED with QERR_UNSUPPORTED 2014-04-25 09:19:59 -04:00
bdrv-commit-all.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
chr-msmouse.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
clock-warp.c aio / timers: Rearrange timer.h & make legacy functions call non-legacy 2013-08-22 19:14:24 +02:00
cpu-get-clock.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
cpu-get-icount.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
cpus.c cpu: Change qemu_init_vcpu() argument to CPUState 2013-06-28 13:25:13 +02:00
dump.c dump: Make DumpState and endian conversion routines available for arch-specific dump code 2014-06-16 13:24:36 +02:00
fd-register.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
fdset-add-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
fdset-find-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
fdset-get-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
fdset-remove-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
gdbstub.c stubs: Optimize dependencies for gdbstub.c 2014-03-02 17:13:31 +04:00
get-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
get-next-serial.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
get-vm-name.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
iothread-lock.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
is-daemonized.c Add qtest for vhost-user 2014-06-19 18:44:18 +03:00
kvm.c kvm: Introduce kvm_arch_irqchip_create 2014-02-26 17:20:00 +00:00
machine-init-done.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
Makefile.objs qmp: add query-memory-devices command 2014-06-19 18:44:22 +03:00
migr-blocker.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
mon-is-qmp.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
mon-printf.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
mon-protocol-event.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
mon-set-error.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
monitor-init.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
notify-event.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
pci-drive-hot-add.c hw: move device-hotplug.o to toplevel, compile it once 2013-03-01 13:57:13 +01:00
qmp_pc_dimm_device_list.c qmp: add query-memory-devices command 2014-06-19 18:44:22 +03:00
qtest.c main-loop: Suppress "I/O thread spun" warnings for qtest 2014-03-13 21:36:50 +01:00
reset.c libqemustub: Add qemu_[un]register_reset() stubs 2013-01-08 21:03:43 +01:00
runstate-check.c blockdev: Refuse to open encrypted image unless paused 2014-03-14 16:24:42 +01:00
set-fd-handler.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
slirp.c slirp: set mainloop timeout with more precise value 2013-09-17 12:26:05 +02:00
sysbus.c libqemustub: sysbus_get_default() stub 2013-01-08 21:03:43 +01:00
uuid.c scsi: prefer UUID to VM name for the initiator name 2013-09-12 08:46:21 +02:00
vc-init.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
vm-stop.c block: asynchronously stop the VM on I/O errors 2014-06-23 16:36:13 +08:00
vmstate.c stubs: Add a vmstate_dummy struct for CONFIG_USER_ONLY 2013-03-12 10:35:54 +01:00