unsigned int iodepth = cct->_conf->bdev_aio_max_queue_depth;
if (use_ioring && ioring_queue_t::supported()) {
- io_queue = std::make_unique<ioring_queue_t>(iodepth);
+ bool use_ioring_hipri = cct->_conf.get_val<bool>("bdev_ioring_hipri");
+ bool use_ioring_sqthread_poll = cct->_conf.get_val<bool>("bdev_ioring_sqthread_poll");
+ io_queue = std::make_unique<ioring_queue_t>(iodepth, use_ioring_hipri, use_ioring_sqthread_poll);
} else {
static bool once;
if (use_ioring && !once) {
#include "liburing.h"
#include <sys/epoll.h>
-/* Options */
-
-static bool hipri = false; /* use IO polling */
-static bool sq_thread = false; /* use kernel submission/poller thread */
-
struct ioring_data {
struct io_uring io_uring;
pthread_mutex_t cq_mutex;
}
}
-ioring_queue_t::ioring_queue_t(unsigned iodepth_) :
+ioring_queue_t::ioring_queue_t(unsigned iodepth_, bool hipri_, bool sq_thread_) :
d(make_unique<ioring_data>()),
- iodepth(iodepth_)
+ iodepth(iodepth_),
+ hipri(hipri_),
+ sq_thread(sq_thread_)
{
}
struct ioring_queue_t final : public io_queue_t {
std::unique_ptr<ioring_data> d;
unsigned iodepth = 0;
+ bool hipri = false;
+ bool sq_thread = false;
typedef std::list<aio_t>::iterator aio_iter;
// Returns true if arch is x86-64 and kernel supports io_uring
static bool supported();
- ioring_queue_t(unsigned iodepth_);
+ ioring_queue_t(unsigned iodepth_, bool hipri_, bool sq_thread_);
~ioring_queue_t() final;
int init(std::vector<int> &fds) final;
.set_default(false)
.set_description("Enables Linux io_uring API instead of libaio"),
+ Option("bdev_ioring_hipri", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
+ .set_default(false)
+ .set_description("Enables Linux io_uring API Use polled IO completions"),
+
+ Option("bdev_ioring_sqthread_poll", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
+ .set_default(false)
+ .set_description("Enables Linux io_uring API Offload submission/completion to kernel thread"),
+
// -----------------------------------------
// kstore