Browse Source

fdmon-io_uring: check CQ ring directly in gsource_check

gsource_check() only looks at the ppoll revents for the io_uring fd,
but CQEs can be posted during gsource_prepare()'s io_uring_submit()
call via kernel task_work processing on syscall exit. These completions
are already sitting in the CQ ring but the ring fd may not be signaled
yet, causing gsource_check() to return false.

Add a fallback io_uring_cq_ready() check so completions that arrive
during submission are dispatched immediately rather than waiting for
the next ppoll() cycle.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Message-ID: <20260213143225.161043-3-axboe@kernel.dk>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
master
Jens Axboe 2 months ago
committed by Stefan Hajnoczi
parent
commit
961fcc0f22
  1. 14
      util/fdmon-io_uring.c

14
util/fdmon-io_uring.c

@ -344,7 +344,19 @@ static void fdmon_io_uring_gsource_prepare(AioContext *ctx)
static bool fdmon_io_uring_gsource_check(AioContext *ctx)
{
gpointer tag = ctx->io_uring_fd_tag;
return g_source_query_unix_fd(&ctx->source, tag) & G_IO_IN;
/* Check ppoll revents (normal path) */
if (g_source_query_unix_fd(&ctx->source, tag) & G_IO_IN) {
return true;
}
/*
* Also check for CQEs that may have been posted during prepare's
* io_uring_submit() via task_work on syscall exit. Without this,
* the main loop can miss completions and sleep in ppoll() until the
* next timer fires.
*/
return io_uring_cq_ready(&ctx->fdmon_io_uring);
}
/* Dispatch CQE handlers that are ready */

Loading…
Cancel
Save