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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to