From 5c81ff5e2642b5891307c02d5a7aa8d2b08715ab Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 30 Nov 2017 10:59:25 -0700 Subject: [PATCH] fio: add check rate flag One of the things we do a lot for each IO, is check if we should be checking the rate. Add a specific flag for that case, so we can answer that question very cheaply. This is good for more than a 5% speedup for a null engine test case. Signed-off-by: Jens Axboe --- fio.h | 21 ++++++++++++++------- init.c | 8 ++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/fio.h b/fio.h index a44f1aae..6b184c25 100644 --- a/fio.h +++ b/fio.h @@ -88,6 +88,7 @@ enum { __TD_F_REGROW_LOGS, __TD_F_MMAP_KEEP, __TD_F_DIRS_CREATED, + __TD_F_CHECK_RATE, __TD_F_LAST, /* not a real bit, keep last */ }; @@ -108,6 +109,7 @@ enum { TD_F_REGROW_LOGS = 1U << __TD_F_REGROW_LOGS, 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, }; enum { @@ -610,8 +612,8 @@ enum { TD_NR, }; -#define TD_ENG_FLAG_SHIFT 16 -#define TD_ENG_FLAG_MASK ((1U << 16) - 1) +#define TD_ENG_FLAG_SHIFT 17 +#define TD_ENG_FLAG_MASK ((1U << 17) - 1) static inline void td_set_ioengine_flags(struct thread_data *td) { @@ -700,8 +702,7 @@ static inline bool fio_fill_issue_time(struct thread_data *td) return false; } -static inline bool __should_check_rate(struct thread_data *td, - enum fio_ddir ddir) +static inline bool option_check_rate(struct thread_data *td, enum fio_ddir ddir) { struct thread_options *o = &td->o; @@ -715,13 +716,19 @@ static inline bool __should_check_rate(struct thread_data *td, return false; } +static inline bool __should_check_rate(struct thread_data *td, + enum fio_ddir ddir) +{ + return (td->flags & TD_F_CHECK_RATE) != 0; +} + static inline bool should_check_rate(struct thread_data *td) { - if (td->bytes_done[DDIR_READ] && __should_check_rate(td, DDIR_READ)) + if (__should_check_rate(td, DDIR_READ) && td->bytes_done[DDIR_READ]) return true; - if (td->bytes_done[DDIR_WRITE] && __should_check_rate(td, DDIR_WRITE)) + if (__should_check_rate(td, DDIR_WRITE) && td->bytes_done[DDIR_WRITE]) return true; - if (td->bytes_done[DDIR_TRIM] && __should_check_rate(td, DDIR_TRIM)) + if (__should_check_rate(td, DDIR_TRIM) && td->bytes_done[DDIR_TRIM]) return true; return false; diff --git a/init.c b/init.c index 7c16b060..607f7e0c 100644 --- a/init.c +++ b/init.c @@ -1112,6 +1112,7 @@ int ioengine_load(struct thread_data *td) static void init_flags(struct thread_data *td) { struct thread_options *o = &td->o; + int i; if (o->verify_backlog) td->flags |= TD_F_VER_BACKLOG; @@ -1141,6 +1142,13 @@ static void init_flags(struct thread_data *td) if (o->mem_type == MEM_CUDA_MALLOC) td->flags &= ~TD_F_SCRAMBLE_BUFFERS; + + for (i = 0; i < DDIR_RWDIR_CNT; i++) { + if (option_check_rate(td, i)) { + td->flags |= TD_F_CHECK_RATE; + break; + } + } } static int setup_random_seeds(struct thread_data *td) -- 2.25.1