Re: [RESEND PATCH V10 14/15] iothread: simplify API by merging iothread_get_aio_context variants

Zhang Chen <[email protected]> Sat, 1 Aug 2026 01:41:56 +0800
Newsgroups org.nongnu.qemu-devel
Message-ID <CAK3tnvLMDvaF4rPuypVSPd9rJFKTfhhugFwbWME5OW-dPfpxLA@mail.gmail.com>
On Fri, Jul 31, 2026, 3:43 PM Markus Armbruster <[email protected]> wrote:

> Zhang Chen <[email protected]> writes:
>
> > Simplify the interface by merging iothread_ref_and_get_aio_context()
> > into iothread_get_aio_context(). The updated function now requires a
> > 'holder' parameter, ensuring that every retrieval of an AioContext for
> > long-term use is automatically registered in the IOThread's holder list.
> >
> > Update all callers across block, virtio, scsi, net, and monitor
> > subsystems to match the new signature. This cleanup reduces code
> > redundancy and improves the reliability of IOThread introspection.
> >
> > Signed-off-by: Zhang Chen <[email protected]>
>
> [...]
>
> > diff --git a/include/system/iothread.h b/include/system/iothread.h
> > index 3cce5eeb09..3a6010b9f0 100644
> > --- a/include/system/iothread.h
> > +++ b/include/system/iothread.h
> > @@ -73,22 +73,22 @@ DECLARE_INSTANCE_CHECKER(IOThread, IOTHREAD,
> >
> >  char *iothread_get_id(IOThread *iothread);
> >  IOThread *iothread_by_id(const char *id);
> > -/*
> > - * The iothread_get_aio_context() and iothread_put_aio_context() are not
> > - * thread-safe and must be called under the Big QEMU Lock (BQL).
> > - */
> > -AioContext *iothread_get_aio_context(IOThread *iothread);
> > +
> >  /*
> >   * Normally the IOThread's AioContext is fetched using
> > - * iothread_ref_and_get_aio_context(), but there are legacy callers
> > + * iothread_get_aio_context(), but there are legacy callers
> >   * without a clear ref/unref lifecycle. They cannot unref (e.g. because
> >   * they do not have an IOThread pointer), so provide an unsafe way to
> >   * fetch the AioContext without holding a reference count. This unsafe
> >   * API serves legacy callers - do not use it in new code.
> >   */
> >  AioContext *iothread_unsafe_get_aio_context(IOThread *iothread);
> > -AioContext *iothread_ref_and_get_aio_context(IOThread *iothread,
> > -                                             const IOThreadHolder
> *holder);
> > +/*
> > + * The iothread_get_aio_context() and iothread_put_aio_context() are not
> > + * thread-safe and must be called under the Big QEMU Lock (BQL).
> > + */
> > +AioContext *iothread_get_aio_context(IOThread *iothread,
> > +                                     const IOThreadHolder *holder);
> >  void iothread_put_aio_context(IOThread *iothread, const IOThreadHolder
> *holder);
> >  GMainContext *iothread_get_g_main_context(IOThread *iothread);
> >
> > diff --git a/iothread.c b/iothread.c
> > index 157bb4d302..9d278efc45 100644
> > --- a/iothread.c
> > +++ b/iothread.c
> > @@ -429,13 +429,8 @@ char *iothread_get_id(IOThread *iothread)
> >      return
> g_strdup(object_get_canonical_path_component(OBJECT(iothread)));
> >  }
> >
> > -AioContext *iothread_get_aio_context(IOThread *iothread)
> > -{
> > -    return iothread->ctx;
> > -}
> > -
> > -AioContext *iothread_ref_and_get_aio_context(IOThread *iothread,
> > -                                             const IOThreadHolder
> *holder)
> > +AioContext *iothread_get_aio_context(IOThread *iothread,
> > +                                     const IOThreadHolder *holder)
> >  {
> >      /* Add IOThreadHolder to the list */
> >      iothread_ref(iothread, holder);
>
> Together with PATCH 04, this renames iothread_get_aio_context() to
> iothread_unsafe_get_aio_context(), and
> iothread_ref_and_get_aio_context() to iothread_get_aio_context().
>
> iothread_get_aio_context() takes a reference now.  That's a very
> significant change.
>
> In my opinion, every function that takes or releases a reference needs a
> function comment unless the function name makes it completely obvious.
> I know we have plenty of functions lacking such comments, but that
> doesn't make me wrong :)
>
> There are similarly named functions that, as far as I can tell, return a
> thing's AioContext without taking a reference:
>
>     bdrv_get_aio_context()
>     blk_get_aio_context()
>     block_job_get_aio_context()
>     iohandler_get_aio_context()
>     qemu_coroutine_get_aio_context()
>     qemu_get_aio_context()
>
> I fear this is going to be confusing.
>
> But I'm not the maintainer.  Who is the maintainer?  MAINTAINERS doesn't
> cover iothread.c, even though it is a core piece of infrastructure.
>
>
Thanks for the detailed review!

1. Documentation:
   I completely agree that functions modifying
 reference counts must be explicitly documented.
I will add comprehensive function comments in
include/sysemu/iothread.h in the next version
to clearly state that iothread_get_aio_context()
takes a reference and requires a matching
iothread_put_aio_context().

2. API naming & consistency:
   The main motivation for merging iothread_ref_and_get_aio_context()
into iothread_get_aio_context(..., holder) was
to enforce holder registration and avoid untracked
AioContext retrievals across subsystems.
The mandatory 'holder' parameter serves as
a explicit hint that this is an acquiring operation.

This series based on Stefan's suggestions, and
he also contributed some of the IOThread relevant work. I'll wait for
feedback from Stefan/Paolo/Markus or others regarding the naming
convention. If they prefer keeping a distinct name (e.g.
iothread_ref_get_aio_context), I am open to adjusting it.

I think Stefan is the missed IOThread maintainer role? (By the way, if he
or anyone else has no objections, I can add it at the end.).

Thanks
Chen



> [...]
>
>