If device thinks that it isn't necessary to apply coroutine in its performance sensitive path, it can call qemu_aio_set_bypass_co(false) to bypass the coroutine which has supported bypass mode and just call the function directly.
One example is virtio-blk dataplane. Signed-off-by: Ming Lei <ming....@canonical.com> --- async.c | 1 + include/block/aio.h | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/async.c b/async.c index 34af0b2..251a074 100644 --- a/async.c +++ b/async.c @@ -293,6 +293,7 @@ AioContext *aio_context_new(void) (EventNotifierHandler *) event_notifier_test_and_clear); timerlistgroup_init(&ctx->tlg, aio_timerlist_notify, ctx); + qemu_aio_set_bypass_co(ctx, false); return ctx; } diff --git a/include/block/aio.h b/include/block/aio.h index c23de3c..48d827e 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -87,6 +87,9 @@ struct AioContext { /* TimerLists for calling timers - one per clock type */ QEMUTimerListGroup tlg; + + /* support selective bypass coroutine */ + bool bypass_co; }; /* Used internally to synchronize aio_poll against qemu_bh_schedule. */ @@ -303,4 +306,14 @@ static inline void aio_timer_init(AioContext *ctx, timer_init(ts, ctx->tlg.tl[type], scale, cb, opaque); } +static inline void qemu_aio_set_bypass_co(AioContext *ctx, bool bypass) +{ + ctx->bypass_co = bypass; +} + +static inline bool qemu_aio_get_bypass_co(AioContext *ctx) +{ + return ctx->bypass_co; +} + #endif -- 1.7.9.5