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 ¶ms) + :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 ¶ms); ~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 ¶ms) +{ + if (int error = io_uring_queue_init_params(entries, &ring, ¶ms); + 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 ¶ms); + ~Ring() noexcept { io_uring_queue_exit(&ring); }