Add TD_F_SYNCS thread flag
authorJens Axboe <axboe@kernel.dk>
Sat, 26 Feb 2022 17:42:01 +0000 (10:42 -0700)
committerJens Axboe <axboe@kernel.dk>
Sat, 26 Feb 2022 17:42:01 +0000 (10:42 -0700)
It's not enough to just track writes, some operating systems require
a file to be opened for write to issue a file sync. Which does kind
of make sense...

Add such a flag and set it for iolog/blktrace replay, if we see a sync
in there.

This does mean we need to bump the IO engine version, as the engine
flags need to get shifted.

Link: https://github.com/axboe/fio/issues/1352
Signed-off-by: Jens Axboe <axboe@kernel.dk>
blktrace.c
fio.h
ioengines.h
iolog.c

index e18047658953f718fdded2212bee42237c42ac9a..ead601304703d216dacee410b565e88d16eee929 100644 (file)
@@ -297,6 +297,10 @@ static bool handle_trace_flush(struct thread_data *td, struct blk_io_trace *t,
 
        ios[DDIR_SYNC]++;
        dprint(FD_BLKTRACE, "store flush delay=%lu\n", ipo->delay);
+
+       if (!(td->flags & TD_F_SYNCS))
+               td->flags |= TD_F_SYNCS;
+
        queue_io_piece(td, ipo);
        return true;
 }
diff --git a/fio.h b/fio.h
index 88df117de405456d66c4687e7c9d35592531455f..c314f0a84477e2461a950228029cb1c272503642 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -97,6 +97,7 @@ enum {
        __TD_F_MMAP_KEEP,
        __TD_F_DIRS_CREATED,
        __TD_F_CHECK_RATE,
+       __TD_F_SYNCS,
        __TD_F_LAST,            /* not a real bit, keep last */
 };
 
@@ -118,6 +119,7 @@ enum {
        TD_F_MMAP_KEEP          = 1U << __TD_F_MMAP_KEEP,
        TD_F_DIRS_CREATED       = 1U << __TD_F_DIRS_CREATED,
        TD_F_CHECK_RATE         = 1U << __TD_F_CHECK_RATE,
+       TD_F_SYNCS              = 1U << __TD_F_SYNCS,
 };
 
 enum {
@@ -678,8 +680,8 @@ enum {
        TD_NR,
 };
 
-#define TD_ENG_FLAG_SHIFT      17
-#define TD_ENG_FLAG_MASK       ((1U << 17) - 1)
+#define TD_ENG_FLAG_SHIFT      18
+#define TD_ENG_FLAG_MASK       ((1U << 18) - 1)
 
 static inline void td_set_ioengine_flags(struct thread_data *td)
 {
index b3f755b477de01f2ece25e93e9ad4d0edfa7bcda..acdb0071f52de85e67d462b1e2fb4773e54970fb 100644 (file)
@@ -8,7 +8,7 @@
 #include "io_u.h"
 #include "zbd_types.h"
 
-#define FIO_IOOPS_VERSION      30
+#define FIO_IOOPS_VERSION      31
 
 #ifndef CONFIG_DYNAMIC_ENGINES
 #define FIO_STATIC     static
diff --git a/iolog.c b/iolog.c
index a2cf0c1ccd6083ebf2b3c0d11686713238ad2983..724ec1fe165adea55d89bad646bd7eb020253577 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -402,6 +402,7 @@ static bool read_iolog2(struct thread_data *td)
        enum fio_ddir rw;
        bool realloc = false;
        int64_t items_to_fetch = 0;
+       int syncs;
 
        if (td->o.read_iolog_chunked) {
                items_to_fetch = iolog_items_to_fetch(td);
@@ -417,7 +418,7 @@ static bool read_iolog2(struct thread_data *td)
        rfname = fname = malloc(256+16);
        act = malloc(256+16);
 
-       reads = writes = waits = 0;
+       syncs = reads = writes = waits = 0;
        while ((p = fgets(str, 4096, td->io_log_rfile)) != NULL) {
                struct io_piece *ipo;
                int r;
@@ -492,7 +493,9 @@ static bool read_iolog2(struct thread_data *td)
                                continue;
                        waits++;
                } else if (rw == DDIR_INVAL) {
-               } else if (!ddir_sync(rw)) {
+               } else if (ddir_sync(rw)) {
+                       syncs++;
+               } else {
                        log_err("bad ddir: %d\n", rw);
                        continue;
                }
@@ -547,6 +550,8 @@ static bool read_iolog2(struct thread_data *td)
                        " read-only\n", td->o.name, writes);
                writes = 0;
        }
+       if (syncs)
+               td->flags |= TD_F_SYNCS;
 
        if (td->o.read_iolog_chunked) {
                if (td->io_log_current == 0) {