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;