From bca9e3e347f31102c0012b13ef40e7d3579071e9 Mon Sep 17 00:00:00 2001 From: Max Kellermann <max.kellermann@ionos.com> Date: Tue, 4 Feb 2025 19:57:35 +0100 Subject: [PATCH] io/uring/Queue: dispatch all completions in SubmitAndWaitDispatchOneCompletion() io_uring_submit_and_wait_timeout() can return multiple completions, even if we wait for only one. We should dispatch them all or we miss wakeups. --- src/io/uring/Queue.cxx | 5 ++--- src/io/uring/Queue.hxx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/io/uring/Queue.cxx b/src/io/uring/Queue.cxx index f1f4080f3..3e7320216 100644 --- a/src/io/uring/Queue.cxx +++ b/src/io/uring/Queue.cxx @@ -104,14 +104,13 @@ Queue::WaitDispatchOneCompletion() } bool -Queue::SubmitAndWaitDispatchOneCompletion(struct __kernel_timespec &timeout) +Queue::SubmitAndWaitDispatchCompletions(struct __kernel_timespec &timeout) { auto *cqe = ring.SubmitAndWaitCompletion(timeout); if (cqe == nullptr) return false; - DispatchOneCompletion(*cqe); - return true; + return DispatchCompletions(*cqe) > 0; } } // namespace Uring diff --git a/src/io/uring/Queue.hxx b/src/io/uring/Queue.hxx index a8e04bccc..e08615f4e 100644 --- a/src/io/uring/Queue.hxx +++ b/src/io/uring/Queue.hxx @@ -101,7 +101,7 @@ public: while (WaitDispatchOneCompletion()) {} } - bool SubmitAndWaitDispatchOneCompletion(struct __kernel_timespec &timeout); + bool SubmitAndWaitDispatchCompletions(struct __kernel_timespec &timeout); private: static void _DispatchOneCompletion(const struct io_uring_cqe &cqe) noexcept;