On Wed, May 28, 2025 at 03:09:09PM -0400, Stefan Hajnoczi wrote: > AioContext's glib integration only supports ppoll(2) file descriptor > monitoring. epoll(7) and io_uring(7) disable themselves and switch back > to ppoll(2) when the glib event loop is used. The main loop thread > cannot use epoll(7) or io_uring(7) because it always uses the glib event > loop. > > Future QEMU features may require io_uring(7). One example is uring_cmd > support in FUSE exports. Each feature could create its own io_uring(7) > context and integrate it into the event loop, but this is inefficient > due to extra syscalls. It would be more efficient to reuse the > AioContext's existing fdmon-io_uring.c io_uring(7) context because > fdmon-io_uring.c will already be active on systems where Linux io_uring > is available. > > In order to keep fdmon-io_uring.c's AioContext operational even when the > glib event loop is used, extend FDMonOps with an API similar to > GSourceFuncs so that file descriptor monitoring can integrate into the > glib event loop. > > A quick summary of the GSourceFuncs API: > - prepare() is called each event loop iteration before waiting for file > descriptors and timers. > - check() is called to determine whether events are ready to be > dispatched after waiting. > - dispatch() is called to process events. > > More details here: https://docs.gtk.org/glib/struct.SourceFuncs.html > > Move the ppoll(2)-specific code from aio-posix.c into fdmon-poll.c and > also implement epoll(7)- and io_uring(7)-specific file descriptor > monitoring code for glib event loops. > > Note that it's still faster to use aio_poll() rather than the glib event > loop since glib waits for file descriptor activity with ppoll(2) and > does not support adaptive polling. But at least epoll(7) and io_uring(7) > now work in glib event loops.
Nice. > > Splitting this into multiple commits without temporarily breaking > AioContext proved difficult so this commit makes all the changes. The > next commit will remove the aio_context_use_g_source() API because it is > no longer needed. Resulting in a big patch, but I agree that there's no easier way to do it more incrementally. > > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > --- > include/block/aio.h | 36 ++++++++++++++++++ > util/aio-posix.h | 5 +++ > tests/unit/test-aio.c | 7 +++- > util/aio-posix.c | 69 ++++++++------------------------- > util/fdmon-epoll.c | 52 ++++++++++++++++++++++--- > util/fdmon-io_uring.c | 44 +++++++++++++++++++++- > util/fdmon-poll.c | 88 ++++++++++++++++++++++++++++++++++++++++++- > 7 files changed, 239 insertions(+), 62 deletions(-) Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake, Principal Software Engineer Red Hat, Inc. Virtualization: qemu.org | libguestfs.org