fio: add check rate flag
authorJens Axboe <axboe@kernel.dk>
Thu, 30 Nov 2017 17:59:25 +0000 (10:59 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 30 Nov 2017 17:59:25 +0000 (10:59 -0700)
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 <axboe@kernel.dk>
fio.h
init.c

diff --git a/fio.h b/fio.h
index a44f1aae47212b9e4065255a68c34dee25480f29..6b184c25399524994945ca63600968939abb9fdb 100644 (file)
--- 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_REGROW_LOGS,
        __TD_F_MMAP_KEEP,
        __TD_F_DIRS_CREATED,
+       __TD_F_CHECK_RATE,
        __TD_F_LAST,            /* not a real bit, keep last */
 };
 
        __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_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 {
 };
 
 enum {
@@ -610,8 +612,8 @@ enum {
        TD_NR,
 };
 
        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)
 {
 
 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;
 }
 
        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;
 
 {
        struct thread_options *o = &td->o;
 
@@ -715,13 +716,19 @@ static inline bool __should_check_rate(struct thread_data *td,
        return false;
 }
 
        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)
 {
 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;
                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;
                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;
                return true;
 
        return false;
diff --git a/init.c b/init.c
index 7c16b0602e252ecd76dae31fe7d044af8f55ccb6..607f7e0c29a472443b8bf90466ffe5ea5f8be4cf 100644 (file)
--- 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;
 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;
 
        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;
 
        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)
 }
 
 static int setup_random_seeds(struct thread_data *td)