Skip to content
  • Kevin Wolf's avatar
    c81219a7
    monitor: Fix assertion failure on shutdown · c81219a7
    Kevin Wolf authored
    
    
    Commit 357bda95 already tried to fix the order in monitor_cleanup() by
    moving shutdown of the dispatcher coroutine further to the start.
    However, it didn't go far enough:
    
    iothread_stop() makes sure that all pending work (bottom halves) in the
    AioContext of the monitor iothread is completed. iothread_destroy()
    depends on this and fails an assertion if there is still a pending BH.
    
    While the dispatcher coroutine is running, it will try to resume the
    monitor after taking a request out of the queue, which involves a BH.
    The dispatcher is run until it terminates in the AIO_WAIT_WHILE() loop.
    However, adding new BHs between iothread_stop() and iothread_destroy()
    is forbidden.
    
    Fix this by stopping the dispatcher first before shutting down the other
    parts of the monitor. This means we can now receive requests that aren't
    handled any more when QEMU is shutting down, but this is unlikely to be
    a problem for QMP clients.
    
    Fixes: 357bda95
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Message-Id: <20210212172028.288825-2-kwolf@redhat.com>
    Tested-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    c81219a7
    monitor: Fix assertion failure on shutdown
    Kevin Wolf authored
    
    
    Commit 357bda95 already tried to fix the order in monitor_cleanup() by
    moving shutdown of the dispatcher coroutine further to the start.
    However, it didn't go far enough:
    
    iothread_stop() makes sure that all pending work (bottom halves) in the
    AioContext of the monitor iothread is completed. iothread_destroy()
    depends on this and fails an assertion if there is still a pending BH.
    
    While the dispatcher coroutine is running, it will try to resume the
    monitor after taking a request out of the queue, which involves a BH.
    The dispatcher is run until it terminates in the AIO_WAIT_WHILE() loop.
    However, adding new BHs between iothread_stop() and iothread_destroy()
    is forbidden.
    
    Fix this by stopping the dispatcher first before shutting down the other
    parts of the monitor. This means we can now receive requests that aren't
    handled any more when QEMU is shutting down, but this is unlikely to be
    a problem for QMP clients.
    
    Fixes: 357bda95
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Message-Id: <20210212172028.288825-2-kwolf@redhat.com>
    Tested-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Loading