summaryrefslogtreecommitdiff
path: root/cpus.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2014-06-05 14:53:58 +0200
committerStefan Hajnoczi <stefanha@redhat.com>2014-06-23 16:36:13 +0800
commit74892d2468b9f0c56b915ce94848d6f7fac39740 (patch)
tree36cc2ea403155751b9ca9fa29ad29f34854102cd /cpus.c
parent5d5da114b39d3cf187a69dcf5eaca7eaf886c041 (diff)
downloadqemu-74892d2468b9f0c56b915ce94848d6f7fac39740.tar.gz
vl: allow other threads to do qemu_system_vmstop_request
There patch protects vmstop_requested with a lock and introduces qemu_system_vmstop_request_prepare. Together with the new call to qemu_vmstop_requested in vm_start, qemu_system_vmstop_request_prepare avoids a race where the VM could remain stopped even though the iostatus of a block device has already been set (for example). qemu_system_vmstop_request_prepare however also lets the caller thread delay observation of the state change until it has itself communicated that change to the user. This delay avoids any possibility of a wrong reordering of the BLOCK_IO_ERROR event and the subsequent STOP event. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'cpus.c')
-rw-r--r--cpus.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/cpus.c b/cpus.c
index 1ec3a9edd4..06da4e7665 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1206,6 +1206,7 @@ void cpu_stop_current(void)
int vm_stop(RunState state)
{
if (qemu_in_vcpu_thread()) {
+ qemu_system_vmstop_request_prepare();
qemu_system_vmstop_request(state);
/*
* FIXME: should not return to device code in case