]> git.proxmox.com Git - mirror_qemu.git/commit
monitor: only run coroutine commands in qemu_aio_context
authorStefan Hajnoczi <stefanha@redhat.com>
Thu, 18 Jan 2024 14:48:23 +0000 (09:48 -0500)
committerKevin Wolf <kwolf@redhat.com>
Fri, 26 Jan 2024 10:16:58 +0000 (11:16 +0100)
commiteffd60c878176bcaf97fa7ce2b12d04bb8ead6f7
tree5a3f0891deebbad4b00ba3f759b42cafbc4abb8b
parent9ee2dd4c22a3639c5462b3fc20df60c005c3de64
monitor: only run coroutine commands in qemu_aio_context

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: 7bed89958bfbf40df9ca681cefbdca63abdde39d ("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: Stefan Hajnoczi <stefanha@redhat.com>
Message-ID: <20240118144823.1497953-4-stefanha@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Tested-by: Fiona Ebner <f.ebner@proxmox.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
32 files changed:
monitor/qmp.c
qapi/qmp-dispatch.c
tests/qemu-iotests/060.out
tests/qemu-iotests/071.out
tests/qemu-iotests/081.out
tests/qemu-iotests/087.out
tests/qemu-iotests/108.out
tests/qemu-iotests/109
tests/qemu-iotests/109.out
tests/qemu-iotests/117.out
tests/qemu-iotests/120.out
tests/qemu-iotests/127.out
tests/qemu-iotests/140.out
tests/qemu-iotests/143.out
tests/qemu-iotests/156.out
tests/qemu-iotests/176.out
tests/qemu-iotests/182.out
tests/qemu-iotests/183.out
tests/qemu-iotests/184.out
tests/qemu-iotests/185
tests/qemu-iotests/185.out
tests/qemu-iotests/191.out
tests/qemu-iotests/195.out
tests/qemu-iotests/223.out
tests/qemu-iotests/227.out
tests/qemu-iotests/247.out
tests/qemu-iotests/273.out
tests/qemu-iotests/308
tests/qemu-iotests/308.out
tests/qemu-iotests/tests/file-io-error
tests/qemu-iotests/tests/iothreads-resize.out
tests/qemu-iotests/tests/qsd-jobs.out