Am 16.01.2024 um 20:00 hat Stefan Hajnoczi geschrieben: > 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. > > 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 <stefa...@redhat.com>
Reviewed-by: Kevin Wolf <kw...@redhat.com>