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> |
||
---|---|---|
.. | ||
arch-query-cpu-def.c | ||
bdrv-commit-all.c | ||
chr-msmouse.c | ||
clock-warp.c | ||
cpu-get-clock.c | ||
cpu-get-icount.c | ||
cpus.c | ||
dump.c | ||
fd-register.c | ||
fdset-add-fd.c | ||
fdset-find-fd.c | ||
fdset-get-fd.c | ||
fdset-remove-fd.c | ||
gdbstub.c | ||
get-fd.c | ||
get-next-serial.c | ||
get-vm-name.c | ||
iothread-lock.c | ||
is-daemonized.c | ||
kvm.c | ||
machine-init-done.c | ||
Makefile.objs | ||
migr-blocker.c | ||
mon-is-qmp.c | ||
mon-printf.c | ||
mon-protocol-event.c | ||
mon-set-error.c | ||
monitor-init.c | ||
notify-event.c | ||
pci-drive-hot-add.c | ||
qmp_pc_dimm_device_list.c | ||
qtest.c | ||
reset.c | ||
runstate-check.c | ||
set-fd-handler.c | ||
slirp.c | ||
sysbus.c | ||
uuid.c | ||
vc-init.c | ||
vm-stop.c | ||
vmstate.c |