engines/libaio: use fio_memalign() helper for user iocbs
authorJens Axboe <axboe@kernel.dk>
Wed, 21 Nov 2018 16:02:47 +0000 (09:02 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 21 Nov 2018 16:02:47 +0000 (09:02 -0700)
Don't rely on posix_memalign() being there, that's why we have
this helper.

Also ensure that the memory is cleared. This is important, as
we are passing this to the kernel, and we can't rely on our
->prep() clearing everything all the time.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
engines/libaio.c

index 07fbe35..00d6216 100644 (file)
@@ -12,6 +12,7 @@
 #include "../fio.h"
 #include "../lib/pow2.h"
 #include "../optgroup.h"
+#include "../lib/memalign.h"
 
 #ifndef IOCB_FLAG_HIPRI
 #define IOCB_FLAG_HIPRI        (1 << 2)
@@ -111,6 +112,8 @@ static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u)
        else
                iocb = &io_u->iocb;
 
+       iocb->u.c.flags = 0;
+
        if (io_u->ddir == DDIR_READ) {
                io_prep_pread(iocb, f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset);
                if (o->hipri)
@@ -387,8 +390,10 @@ static void fio_libaio_cleanup(struct thread_data *td)
                free(ld->aio_events);
                free(ld->iocbs);
                free(ld->io_us);
-               if (ld->user_iocbs)
-                       free(ld->user_iocbs);
+               if (ld->user_iocbs) {
+                       size_t size = td->o.iodepth * sizeof(struct iocb);
+                       fio_memfree(ld->user_iocbs, size, false);
+               }
                free(ld);
        }
 }
@@ -440,16 +445,11 @@ static int fio_libaio_init(struct thread_data *td)
 
        if (o->useriocb) {
                size_t size;
-               void *p;
 
                ld->io_u_index = calloc(td->o.iodepth, sizeof(struct io_u *));
                size = td->o.iodepth * sizeof(struct iocb);
-               if (posix_memalign(&p, page_size, size)) {
-                       log_err("fio: libaio iocb allocation failure\n");
-                       free(ld);
-                       return 1;
-               }
-               ld->user_iocbs = p;
+               ld->user_iocbs = fio_memalign(page_size, size, false);
+               memset(ld->user_iocbs, 0, size);
        }
 
        /*
@@ -461,8 +461,10 @@ static int fio_libaio_init(struct thread_data *td)
        if (err) {
                td_verror(td, -err, "io_queue_init");
                log_err("fio: check /proc/sys/fs/aio-max-nr\n");
-               if (ld->user_iocbs)
-                       free(ld->user_iocbs);
+               if (ld->user_iocbs) {
+                       size_t size = td->o.iodepth * sizeof(struct iocb);
+                       fio_memfree(ld->user_iocbs, size, false);
+               }
                free(ld);
                return 1;
        }