We don't need the user ring, unless the job file specified
that we need it. So tell the kernel. Fall back to passing
in the normal queue depth, if the kernel doesn't support
disabling the user ring.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
static int fio_libaio_init(struct thread_data *td)
{
struct libaio_data *ld = malloc(sizeof(*ld));
static int fio_libaio_init(struct thread_data *td)
{
struct libaio_data *ld = malloc(sizeof(*ld));
+ struct libaio_options *o = td->eo;
+ int err = 0;
memset(ld, 0, sizeof(*ld));
memset(ld, 0, sizeof(*ld));
- err = io_queue_init(td->o.iodepth, &ld->aio_ctx);
+ /*
+ * First try passing in 0 for queue depth, since we don't
+ * care about the user ring. If that fails, the kernel is too old
+ * and we need the right depth.
+ */
+ if (!o->userspace_reap)
+ err = io_queue_init(0, &ld->aio_ctx);
+ if (o->userspace_reap || err == -EINVAL)
+ err = io_queue_init(td->o.iodepth, &ld->aio_ctx);
if (err) {
td_verror(td, -err, "io_queue_init");
log_err("fio: check /proc/sys/fs/aio-max-nr\n");
if (err) {
td_verror(td, -err, "io_queue_init");
log_err("fio: check /proc/sys/fs/aio-max-nr\n");