Skip to content
Snippets Groups Projects
  • Stefan Hajnoczi's avatar
    f389309d
    monitor: only run coroutine commands in qemu_aio_context · f389309d
    Stefan Hajnoczi authored
    monitor_qmp_dispatcher_co() runs in the iohandler AioContext that is not
    polled during nested event loops. The coroutine currently reschedules
    itself in the main loop's qemu_aio_context AioContext, which is polled
    during nested event loops. One known problem is that QMP device-add
    calls drain_call_rcu(), which temporarily drops the BQL, leading to all
    sorts of havoc like other vCPU threads re-entering device emulation code
    while another vCPU thread is waiting in device emulation code with
    aio_poll().
    
    Paolo Bonzini suggested running non-coroutine QMP handlers in the
    iohandler AioContext. This avoids trouble with nested event loops. His
    original idea was to move coroutine rescheduling to
    monitor_qmp_dispatch(), but I resorted to moving it to qmp_dispatch()
    because we don't know if the QMP handler needs to run in coroutine
    context in monitor_qmp_dispatch(). monitor_qmp_dispatch() would have
    been nicer since it's associated with the monitor implementation and not
    as general as qmp_dispatch(), which is also used by qemu-ga.
    
    A number of qemu-iotests need updated .out files because the order of
    QMP events vs QMP responses has changed.
    
    Solves Issue #1933.
    
    Cc: qemu-stable@nongnu.org
    Fixes: 7bed8995 ("device_core: use drain_call_rcu in in qmp_device_add")
    Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2215192
    Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2214985
    Buglink: https://issues.redhat.com/browse/RHEL-17369
    
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-ID: <20240118144823.1497953-4-stefanha@redhat.com>
    Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
    Tested-by: default avatarFiona Ebner <f.ebner@proxmox.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    (cherry picked from commit effd60c878176bcaf97fa7ce2b12d04bb8ead6f7)
    Signed-off-by: default avatarMichael Tokarev <mjt@tls.msk.ru>
    f389309d
    History
    monitor: only run coroutine commands in qemu_aio_context
    Stefan Hajnoczi authored
    monitor_qmp_dispatcher_co() runs in the iohandler AioContext that is not
    polled during nested event loops. The coroutine currently reschedules
    itself in the main loop's qemu_aio_context AioContext, which is polled
    during nested event loops. One known problem is that QMP device-add
    calls drain_call_rcu(), which temporarily drops the BQL, leading to all
    sorts of havoc like other vCPU threads re-entering device emulation code
    while another vCPU thread is waiting in device emulation code with
    aio_poll().
    
    Paolo Bonzini suggested running non-coroutine QMP handlers in the
    iohandler AioContext. This avoids trouble with nested event loops. His
    original idea was to move coroutine rescheduling to
    monitor_qmp_dispatch(), but I resorted to moving it to qmp_dispatch()
    because we don't know if the QMP handler needs to run in coroutine
    context in monitor_qmp_dispatch(). monitor_qmp_dispatch() would have
    been nicer since it's associated with the monitor implementation and not
    as general as qmp_dispatch(), which is also used by qemu-ga.
    
    A number of qemu-iotests need updated .out files because the order of
    QMP events vs QMP responses has changed.
    
    Solves Issue #1933.
    
    Cc: qemu-stable@nongnu.org
    Fixes: 7bed8995 ("device_core: use drain_call_rcu in in qmp_device_add")
    Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2215192
    Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2214985
    Buglink: https://issues.redhat.com/browse/RHEL-17369
    
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-ID: <20240118144823.1497953-4-stefanha@redhat.com>
    Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
    Tested-by: default avatarFiona Ebner <f.ebner@proxmox.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    (cherry picked from commit effd60c878176bcaf97fa7ce2b12d04bb8ead6f7)
    Signed-off-by: default avatarMichael Tokarev <mjt@tls.msk.ru>
qmp.c 17.61 KiB