From 78c0d7a0120f7a117493811f6abf6c2a48a06453 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sat, 26 Feb 2022 10:42:01 -0700 Subject: [PATCH] Add TD_F_SYNCS thread flag 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 --- blktrace.c | 4 ++++ fio.h | 6 ++++-- ioengines.h | 2 +- iolog.c | 9 +++++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/blktrace.c b/blktrace.c index e1804765..ead60130 100644 --- a/blktrace.c +++ b/blktrace.c @@ -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 88df117d..c314f0a8 100644 --- 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) { diff --git a/ioengines.h b/ioengines.h index b3f755b4..acdb0071 100644 --- a/ioengines.h +++ b/ioengines.h @@ -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 a2cf0c1c..724ec1fe 100644 --- 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) { -- 2.25.1