When aio_context_new() -> aio_context_setup() fails at startup it doesn't really matter whether errors are returned to the caller or the process terminates immediately.
However, it is not acceptable to terminate when hotplugging --object iothread at runtime. Refactor aio_context_setup() so that errors can be propagated. The next commit will set errp when fdmon_io_uring_setup() fails. Suggested-by: Kevin Wolf <kw...@redhat.com> Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> Reviewed-by: Eric Blake <ebl...@redhat.com> --- include/block/aio.h | 3 ++- util/aio-posix.c | 2 +- util/aio-win32.c | 2 +- util/async.c | 7 ++++++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/include/block/aio.h b/include/block/aio.h index 2760f308f5..d919d7c8f4 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -718,10 +718,11 @@ void qemu_set_current_aio_context(AioContext *ctx); /** * aio_context_setup: * @ctx: the aio context + * @errp: error pointer * * Initialize the aio context. */ -void aio_context_setup(AioContext *ctx); +void aio_context_setup(AioContext *ctx, Error **errp); /** * aio_context_destroy: diff --git a/util/aio-posix.c b/util/aio-posix.c index bebd9ce3a2..bbe470c145 100644 --- a/util/aio-posix.c +++ b/util/aio-posix.c @@ -718,7 +718,7 @@ bool aio_poll(AioContext *ctx, bool blocking) return progress; } -void aio_context_setup(AioContext *ctx) +void aio_context_setup(AioContext *ctx, Error **errp) { ctx->fdmon_ops = &fdmon_poll_ops; ctx->epollfd = -1; diff --git a/util/aio-win32.c b/util/aio-win32.c index 34c4074133..4ba401ff92 100644 --- a/util/aio-win32.c +++ b/util/aio-win32.c @@ -419,7 +419,7 @@ bool aio_poll(AioContext *ctx, bool blocking) return progress; } -void aio_context_setup(AioContext *ctx) +void aio_context_setup(AioContext *ctx, Error **errp) { } diff --git a/util/async.c b/util/async.c index 34aaab4e9e..2bb7e1f3c1 100644 --- a/util/async.c +++ b/util/async.c @@ -577,6 +577,7 @@ static void co_schedule_bh_cb(void *opaque) AioContext *aio_context_new(Error **errp) { + ERRP_GUARD(); int ret; AioContext *ctx; @@ -590,7 +591,11 @@ AioContext *aio_context_new(Error **errp) goto fail; } - aio_context_setup(ctx); + aio_context_setup(ctx, errp); + if (*errp) { + event_notifier_cleanup(&ctx->notifier); + goto fail; + } g_source_set_can_recurse(&ctx->source, true); qemu_lockcnt_init(&ctx->list_lock); -- 2.50.1