On Tue, Sep 12, 2023 at 7:08 PM Kevin Wolf <[email protected]> wrote: > > Any caller of qmp_dispatch() knows if it is in a coroutine or not. > > qemu-ga uses neither a coroutine dispatcher nor coroutine commands. > > QEMU uses non-coroutine dispatch for out-of-band commands (and we can > > forbid coroutine + allow-oob at the same time), and coroutine dispatch > > for the others. > > > > So, moving out of coroutine context (through a bottom half) should be > > done by monitor_qmp_dispatch(), and likewise moving temporarily out of > > the iohandler context in the case of coroutine commands. In the case > > of !req_obj->req you don't need to do either of those. qmp_dispatch() > > can still assert that the coroutine-ness of the command matches the > > context in which qmp_dispatch() is called. > > > > Once this is done, I think moving out of coroutine context can use a > > BH that runs in the iohandler context. > > Non-coroutine handlers could probably stay in iothread_ctx, but I don't > think we can avoid switching to a different for coroutine handlers.
Agreed. > So maybe we can just move the rescheduling down to the coroutine case in > qmp_dispatch(). Not sure about qmp_dispatch (see above: any caller of the function knows if it is in a coroutine or not, and qemu-ga need not know about coroutines at all). But what you said also applies if the rescheduling is only pushed to monitor_qmp_dispatch(), which would be my first option. Thanks! Paolo
