mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
qmp: Move dispatcher to a coroutine
This moves the QMP dispatcher to a coroutine and runs all QMP command handlers that declare 'coroutine': true in coroutine context so they can avoid blocking the main loop while doing I/O or waiting for other events. For commands that are not declared safe to run in a coroutine, the dispatcher drops out of coroutine context by calling the QMP command handler from a bottom half. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20201005155855.256490-10-kwolf@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
04f22362f1
commit
9ce44e2ce2
7 changed files with 213 additions and 45 deletions
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "block/block.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/rcu.h"
|
||||
#include "qemu/rcu_queue.h"
|
||||
#include "qemu/sockets.h"
|
||||
|
@ -558,8 +559,13 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
|||
* There cannot be two concurrent aio_poll calls for the same AioContext (or
|
||||
* an aio_poll concurrent with a GSource prepare/check/dispatch callback).
|
||||
* We rely on this below to avoid slow locked accesses to ctx->notify_me.
|
||||
*
|
||||
* aio_poll() may only be called in the AioContext's thread. iohandler_ctx
|
||||
* is special in that it runs in the main thread, but that thread's context
|
||||
* is qemu_aio_context.
|
||||
*/
|
||||
assert(in_aio_context_home_thread(ctx));
|
||||
assert(in_aio_context_home_thread(ctx == iohandler_get_aio_context() ?
|
||||
qemu_get_aio_context() : ctx));
|
||||
|
||||
qemu_lockcnt_inc(&ctx->list_lock);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue