diff options
author | Fam Zheng <famz@redhat.com> | 2017-05-03 15:28:19 +0800 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2017-05-05 12:10:00 +0200 |
commit | 6796b4008bd195e6765a1144dc98a8673e69d169 (patch) | |
tree | 6262203b28919373df92ee238835ca701a4fba38 | |
parent | 8a3c3d996ef7df6982d6f51bb79893036ab08c7f (diff) |
dump: Acquire BQL around vm_start() in dump thread
This fixes an assertion failure in the following backtrace:
__GI___assert_fail
memory_region_transaction_commit
memory_region_add_eventfd
virtio_pci_ioeventfd_assign
virtio_bus_set_host_notifier
virtio_blk_data_plane_start
virtio_bus_start_ioeventfd
virtio_vmstate_change
vm_state_notify
vm_prepare_start
vm_start
dump_cleanup
dump_process
dump_thread
start_thread
clone
vm_start need BQL, acquire it if doing cleaning up from main thread.
Signed-off-by: Fam Zheng <famz@redhat.com>
Message-Id: <20170503072819.14462-1-famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | dump.c | 7 | ||||
-rw-r--r-- | include/sysemu/dump.h | 1 |
2 files changed, 8 insertions, 0 deletions
@@ -77,7 +77,13 @@ static int dump_cleanup(DumpState *s) memory_mapping_list_free(&s->list); close(s->fd); if (s->resume) { + if (s->detached) { + qemu_mutex_lock_iothread(); + } vm_start(); + if (s->detached) { + qemu_mutex_unlock_iothread(); + } } return 0; @@ -1804,6 +1810,7 @@ void qmp_dump_guest_memory(bool paging, const char *file, if (detach_p) { /* detached dump */ + s->detached = true; qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread, s, QEMU_THREAD_DETACHED); } else { diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h index ef931be469..2672a15f8b 100644 --- a/include/sysemu/dump.h +++ b/include/sysemu/dump.h @@ -157,6 +157,7 @@ typedef struct DumpState { uint32_t sh_info; bool have_section; bool resume; + bool detached; ssize_t note_size; hwaddr memory_offset; int fd; |