On 06/05/2014 06:53 AM, Paolo Bonzini wrote: > 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 <pbonz...@redhat.com> > --- > block.c | 20 ++++++++++++++++++-- > docs/qmp/qmp-events.txt | 2 +- > stubs/vm-stop.c | 7 ++++++- > 3 files changed, 25 insertions(+), 4 deletions(-)
This may need to be rebased, since events are now QAPI. Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature