diff --git a/src/io/uring/Queue.cxx b/src/io/uring/Queue.cxx
index 3c45c03ce..2ce9f220e 100644
--- a/src/io/uring/Queue.cxx
+++ b/src/io/uring/Queue.cxx
@@ -15,6 +15,11 @@ Queue::Queue(unsigned entries, unsigned flags)
 {
 }
 
+Queue::Queue(unsigned entries, struct io_uring_params &params)
+	:ring(entries, params)
+{
+}
+
 Queue::~Queue() noexcept
 {
 	operations.clear_and_dispose(DeleteDisposer{});
diff --git a/src/io/uring/Queue.hxx b/src/io/uring/Queue.hxx
index 0f5f8c0da..2264b9e49 100644
--- a/src/io/uring/Queue.hxx
+++ b/src/io/uring/Queue.hxx
@@ -23,6 +23,7 @@ class Queue {
 
 public:
 	Queue(unsigned entries, unsigned flags);
+	Queue(unsigned entries, struct io_uring_params &params);
 	~Queue() noexcept;
 
 	FileDescriptor GetFileDescriptor() const noexcept {
diff --git a/src/io/uring/Ring.cxx b/src/io/uring/Ring.cxx
index 5592f54ae..7b171dfb8 100644
--- a/src/io/uring/Ring.cxx
+++ b/src/io/uring/Ring.cxx
@@ -14,6 +14,13 @@ Ring::Ring(unsigned entries, unsigned flags)
 		throw MakeErrno(-error, "io_uring_queue_init() failed");
 }
 
+Ring::Ring(unsigned entries, struct io_uring_params &params)
+{
+	if (int error = io_uring_queue_init_params(entries, &ring, &params);
+	    error < 0)
+		throw MakeErrno(-error, "io_uring_queue_init_params() failed");
+}
+
 void
 Ring::Submit()
 {
diff --git a/src/io/uring/Ring.hxx b/src/io/uring/Ring.hxx
index b16c6ed12..aac105fc3 100644
--- a/src/io/uring/Ring.hxx
+++ b/src/io/uring/Ring.hxx
@@ -26,6 +26,16 @@ public:
 	 */
 	Ring(unsigned entries, unsigned flags);
 
+	/**
+	 * Construct the io_uring using io_uring_queue_init().
+	 *
+	 * Throws on error.
+	 *
+	 * @param params initialization parameters; will also be
+	 * written to by this constructor
+	 */
+	Ring(unsigned entries, struct io_uring_params &params);
+
 	~Ring() noexcept {
 		io_uring_queue_exit(&ring);
 	}