diff --git a/src/io/uring/Queue.cxx b/src/io/uring/Queue.cxx
index 9b4cd050d..f1f4080f3 100644
--- a/src/io/uring/Queue.cxx
+++ b/src/io/uring/Queue.cxx
@@ -51,8 +51,8 @@ Queue::AddPending(struct io_uring_sqe &sqe,
 	io_uring_sqe_set_data(&sqe, c);
 }
 
-void
-Queue::DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept
+inline void
+Queue::_DispatchOneCompletion(const struct io_uring_cqe &cqe) noexcept
 {
 	void *data = io_uring_cqe_get_data(&cqe);
 	if (data != nullptr) {
@@ -64,7 +64,12 @@ Queue::DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept
 			delete c;
 		}
 	}
+}
 
+void
+Queue::DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept
+{
+	_DispatchOneCompletion(cqe);
 	ring.SeenCompletion(cqe);
 }
 
@@ -79,6 +84,14 @@ Queue::DispatchOneCompletion()
 	return true;
 }
 
+inline unsigned
+Queue::DispatchCompletions(struct io_uring_cqe &_cqe) noexcept
+{
+	return ring.VisitCompletions(&_cqe, [](const struct io_uring_cqe &cqe){
+		_DispatchOneCompletion(cqe);
+	});
+}
+
 bool
 Queue::WaitDispatchOneCompletion()
 {
diff --git a/src/io/uring/Queue.hxx b/src/io/uring/Queue.hxx
index 02d4fbdff..a8e04bccc 100644
--- a/src/io/uring/Queue.hxx
+++ b/src/io/uring/Queue.hxx
@@ -104,7 +104,13 @@ public:
 	bool SubmitAndWaitDispatchOneCompletion(struct __kernel_timespec &timeout);
 
 private:
+	static void _DispatchOneCompletion(const struct io_uring_cqe &cqe) noexcept;
 	void DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept;
+
+	/**
+	 * Dispatch all completions using io_uring_for_each_cqe().
+	 */
+	unsigned DispatchCompletions(struct io_uring_cqe &cqe) noexcept;
 };
 
 } // namespace Uring