Fix variable type warning
[fio.git] / engines / libaio.c
index e4869aa9d6a8648a7dbe9413421019f7b7b83234..f17260d32911523b563d3c8493abcb3f67960eba 100644 (file)
@@ -14,8 +14,6 @@
 
 #ifdef FIO_HAVE_LIBAIO
 
-#define ev_to_iou(ev)  (struct io_u *) ((unsigned long) (ev)->obj)
-
 struct libaio_data {
        io_context_t aio_ctx;
        struct io_event *aio_events;
@@ -62,7 +60,7 @@ static struct io_u *fio_libaio_event(struct thread_data *td, int event)
        struct io_u *io_u;
 
        ev = ld->aio_events + event;
-       io_u = ev_to_iou(ev);
+       io_u = container_of(ev->obj, struct io_u, iocb);
 
        if (ev->res != io_u->xfer_buflen) {
                if (ev->res > io_u->xfer_buflen)
@@ -255,11 +253,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(INT_MAX, &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");