libaio: pass in 0 for queue depth if we can
authorJens Axboe <axboe@kernel.dk>
Tue, 4 Sep 2012 17:47:00 +0000 (11:47 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 4 Sep 2012 17:51:33 +0000 (11:51 -0600)
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>
engines/libaio.c

index e4869aa..ad7903c 100644 (file)
@@ -255,11 +255,20 @@ static void fio_libaio_cleanup(struct thread_data *td)
 static int fio_libaio_init(struct thread_data *td)
 {
        struct libaio_data *ld = malloc(sizeof(*ld));
-       int err;
+       struct libaio_options *o = td->eo;
+       int err = 0;
 
        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");