@@ -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;
}
@@ -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
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.lei@canonical.com> --- async.c | 1 + include/block/aio.h | 13 +++++++++++++ 2 files changed, 14 insertions(+)