Merge branch 'python3-testing' of https://github.com/vincentkfu/fio
[fio.git] / ioengines.c
index 433da604ae4af03daf9fc8b8d5a81b2097ed0362..2c7a0df9ed39fa02da08691c4fb85cdf6eadbb90 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "fio.h"
 #include "diskutil.h"
+#include "zbd.h"
 
 static FLIST_HEAD(engine_list);
 
@@ -120,19 +121,15 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
        return ops;
 }
 
-static struct ioengine_ops *__load_ioengine(const char *name)
+static struct ioengine_ops *__load_ioengine(const char *engine)
 {
-       char engine[64];
-
-       engine[sizeof(engine) - 1] = '\0';
-       strncpy(engine, name, sizeof(engine) - 1);
-
        /*
         * linux libaio has alias names, so convert to what we want
         */
-       if (!strncmp(engine, "linuxaio", 8) || !strncmp(engine, "aio", 3)) {
-               dprint(FD_IO, "converting ioengine name: %s -> libaio\n", name);
-               strcpy(engine, "libaio");
+       if (!strncmp(engine, "linuxaio", 8)) {
+               dprint(FD_IO, "converting ioengine name: %s -> libaio\n",
+                      engine);
+               engine = "libaio";
        }
 
        dprint(FD_IO, "load ioengine %s\n", engine);
@@ -288,6 +285,15 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
        assert((io_u->flags & IO_U_F_FLIGHT) == 0);
        io_u_set(td, io_u, IO_U_F_FLIGHT);
 
+       /*
+        * If overlap checking was enabled in offload mode we
+        * can release this lock that was acquired when we
+        * started the overlap check because the IO_U_F_FLIGHT
+        * flag is now set
+        */
+       if (td_offload_overlap(td))
+               pthread_mutex_unlock(&overlap_check);
+
        assert(fio_file_open(io_u->file));
 
        /*
@@ -298,7 +304,9 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
        io_u->error = 0;
        io_u->resid = 0;
 
-       if (td_ioengine_flagged(td, FIO_SYNCIO)) {
+       if (td_ioengine_flagged(td, FIO_SYNCIO) ||
+               (td_ioengine_flagged(td, FIO_ASYNCIO_SYNC_TRIM) && 
+               io_u->ddir == DDIR_TRIM)) {
                if (fio_fill_issue_time(td))
                        fio_gettime(&io_u->issue_time, NULL);
 
@@ -310,6 +318,7 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
                                        sizeof(io_u->issue_time));
        }
 
+
        if (ddir_rw(ddir)) {
                if (!(io_u->flags & IO_U_F_VER_LIST)) {
                        td->io_issues[ddir]++;
@@ -319,6 +328,7 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
        }
 
        ret = td->io_ops->queue(td, io_u);
+       zbd_queue_io_u(io_u, ret);
 
        unlock_file(td, io_u->file);
 
@@ -350,27 +360,39 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
                         "invalid block size. Try setting direct=0.\n");
        }
 
+       if (zbd_unaligned_write(io_u->error) &&
+           td->io_issues[io_u->ddir & 1] == 1 &&
+           td->o.zone_mode != ZONE_MODE_ZBD) {
+               log_info("fio: first I/O failed. If %s is a zoned block device, consider --zonemode=zbd\n",
+                        io_u->file->file_name);
+       }
+
        if (!td->io_ops->commit) {
                io_u_mark_submit(td, 1);
                io_u_mark_complete(td, 1);
+               zbd_put_io_u(io_u);
        }
 
        if (ret == FIO_Q_COMPLETED) {
-               if (ddir_rw(io_u->ddir) || ddir_sync(io_u->ddir)) {
+               if (ddir_rw(io_u->ddir) ||
+                   (ddir_sync(io_u->ddir) && td->runstate != TD_FSYNCING)) {
                        io_u_mark_depth(td, 1);
                        td->ts.total_io_u[io_u->ddir]++;
                }
        } else if (ret == FIO_Q_QUEUED) {
                td->io_u_queued++;
 
-               if (ddir_rw(io_u->ddir) || ddir_sync(io_u->ddir))
+               if (ddir_rw(io_u->ddir) ||
+                   (ddir_sync(io_u->ddir) && td->runstate != TD_FSYNCING))
                        td->ts.total_io_u[io_u->ddir]++;
 
                if (td->io_u_queued >= td->o.iodepth_batch)
                        td_io_commit(td);
        }
 
-       if (!td_ioengine_flagged(td, FIO_SYNCIO)) {
+       if (!td_ioengine_flagged(td, FIO_SYNCIO) &&
+               (!td_ioengine_flagged(td, FIO_ASYNCIO_SYNC_TRIM) ||
+                io_u->ddir != DDIR_TRIM)) {
                if (fio_fill_issue_time(td))
                        fio_gettime(&io_u->issue_time, NULL);