Convert qemu_bh_schedule() to qemu_bh_schedule_event() and aio_bh_schedule_oneshot() to aio_bh_schedule_oneshot_event(), which can specify the clock type, making it compatible with record-replay.
Coroutine scheduling does not affect target machine state, so it should use QEMU_CLOCK_REALTIME so it is not recorded and replayed. Signed-off-by: Nicholas Piggin <npig...@gmail.com> --- job.c | 3 ++- util/async.c | 2 +- scripts/block-coroutine-wrapper.py | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/job.c b/job.c index 660ce22c56b..45e9d9fc096 100644 --- a/job.c +++ b/job.c @@ -1109,7 +1109,8 @@ static void coroutine_fn job_co_entry(void *opaque) job->deferred_to_main_loop = true; job->busy = true; } - aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job); + aio_bh_schedule_oneshot_event(qemu_get_aio_context(), job_exit, job, + QEMU_CLOCK_REALTIME); } void job_start(Job *job) diff --git a/util/async.c b/util/async.c index b88083ecbe7..6ac994effec 100644 --- a/util/async.c +++ b/util/async.c @@ -683,7 +683,7 @@ void aio_co_schedule(AioContext *ctx, Coroutine *co) QSLIST_INSERT_HEAD_ATOMIC(&ctx->scheduled_coroutines, co, co_scheduled_next); - qemu_bh_schedule(ctx->co_schedule_bh); + qemu_bh_schedule_event(ctx->co_schedule_bh, QEMU_CLOCK_REALTIME); aio_context_unref(ctx); } diff --git a/scripts/block-coroutine-wrapper.py b/scripts/block-coroutine-wrapper.py index dbbde99e39e..c111c322487 100644 --- a/scripts/block-coroutine-wrapper.py +++ b/scripts/block-coroutine-wrapper.py @@ -292,7 +292,8 @@ def gen_no_co_wrapper(func: FuncDecl) -> str: }}; assert(qemu_in_coroutine()); - aio_bh_schedule_oneshot(qemu_get_aio_context(), {name}_bh, &s); + aio_bh_schedule_oneshot_event(qemu_get_aio_context(), {name}_bh, &s, + QEMU_CLOCK_REALTIME); qemu_coroutine_yield(); {func.ret} -- 2.45.2