[Qemu-devel] [PATCH] dump: Acquire BQL around vm_start() in dump thread

Fam Zheng posted 1 patch 7 years ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20170503072819.14462-1-famz@redhat.com
Test checkpatch passed
Test docker passed
Test s390x passed
dump.c                | 7 +++++++
include/sysemu/dump.h | 1 +
2 files changed, 8 insertions(+)
[Qemu-devel] [PATCH] dump: Acquire BQL around vm_start() in dump thread
Posted by Fam Zheng 7 years ago
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>
---
 dump.c                | 7 +++++++
 include/sysemu/dump.h | 1 +
 2 files changed, 8 insertions(+)

diff --git a/dump.c b/dump.c
index f7b80d8..d9090a2 100644
--- a/dump.c
+++ b/dump.c
@@ -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 ef931be..2672a15 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;
-- 
2.9.3


Re: [Qemu-devel] [PATCH] dump: Acquire BQL around vm_start() in dump thread
Posted by Fam Zheng 7 years ago
On Wed, 05/03 15:28, Fam Zheng wrote:
> 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.

Oops, s/need/needs and s/main thread/detached thread/.

Fam

Re: [Qemu-devel] [PATCH] dump: Acquire BQL around vm_start() in dump thread
Posted by Marc-André Lureau 7 years ago
Hi

On Wed, May 3, 2017 at 11:42 AM Fam Zheng <famz@redhat.com> wrote:

> On Wed, 05/03 15:28, Fam Zheng wrote:
> > This fixes an assertion failure in the following backtrace:
> >
>

Do you know if it's a regression? Is this a racy case? (I couldn't
reproduce)


> >     __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.
>
> Oops, s/need/needs and s/main thread/detached thread/.
>

With that fixed,
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

-- 
Marc-André Lureau
Re: [Qemu-devel] [PATCH] dump: Acquire BQL around vm_start() in dump thread
Posted by Paolo Bonzini 7 years ago

On 03/05/2017 10:37, Marc-André Lureau wrote:
> Hi
> 
> On Wed, May 3, 2017 at 11:42 AM Fam Zheng <famz@redhat.com
> <mailto:famz@redhat.com>> wrote:
> 
>     On Wed, 05/03 15:28, Fam Zheng wrote:
>     > This fixes an assertion failure in the following backtrace:
> 
> Do you know if it's a regression? Is this a racy case? (I couldn't
> reproduce)

I think it's never worked since separate-thread dump was introduced.

Paolo

> 
>     >     __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.
> 
>     Oops, s/need/needs and s/main thread/detached thread/.
> 
>  
> With that fixed,
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com
> <mailto:marcandre.lureau@redhat.com>>
> 
> -- 
> Marc-André Lureau

Re: [Qemu-devel] [PATCH] dump: Acquire BQL around vm_start() in dump thread
Posted by Paolo Bonzini 7 years ago

On 03/05/2017 09:28, Fam Zheng wrote:
> 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>
> ---
>  dump.c                | 7 +++++++
>  include/sysemu/dump.h | 1 +
>  2 files changed, 8 insertions(+)
> 
> diff --git a/dump.c b/dump.c
> index f7b80d8..d9090a2 100644
> --- a/dump.c
> +++ b/dump.c
> @@ -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 ef931be..2672a15 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;
> 

Queued, thanks.

Paolo