Cleanup the parallellized log writing
authorJens Axboe <axboe@fb.com>
Thu, 3 Apr 2014 02:01:27 +0000 (20:01 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 3 Apr 2014 02:01:27 +0000 (20:01 -0600)
And move it all to iolog.c, this means we can un-export
some of the log functions, too.

Signed-off-by: Jens Axboe <axboe@fb.com>
backend.c
iolog.c
iolog.h

index 5e7a388b9d5f2d5c43022485305ec3868231311a..5ac365925fdd469a948643bd9ed14bc9759b3f94 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -1223,120 +1223,6 @@ static uint64_t do_dry_run(struct thread_data *td)
        return bytes_done[DDIR_WRITE] + bytes_done[DDIR_TRIM];
 }
 
-static int write_this_log(struct thread_data *td, struct io_log *log,
-                         const char *log_file, const char *name, int try)
-{
-       int ret;
-
-       if (!log)
-               return 0;
-
-       if (log_file)
-               ret = finish_log_named(td, log, log_file, name, try);
-       else
-               ret = finish_log(td, log, name, try);
-
-       return ret;
-}
-
-static int write_iops_log(struct thread_data *td, struct thread_options *o,
-                         int try)
-{
-       return write_this_log(td, td->iops_log, o->iops_log_file, "iops", try);
-}
-
-static int write_slat_log(struct thread_data *td, struct thread_options *o,
-                         int try)
-{
-       return write_this_log(td, td->slat_log, o->lat_log_file, "slat", try);
-}
-
-static int write_clat_log(struct thread_data *td, struct thread_options *o,
-                         int try)
-{
-       return write_this_log(td, td->clat_log, o->lat_log_file, "clat" , try);
-}
-
-static int write_lat_log(struct thread_data *td, struct thread_options *o,
-                        int try)
-{
-       return write_this_log(td, td->lat_log, o->lat_log_file, "lat", try);
-}
-
-static int write_bandw_log(struct thread_data *td, struct thread_options *o,
-                       int try)
-{
-       return write_this_log(td, td->bw_log, o->bw_log_file, "bw", try);
-}
-
-enum {
-       BW_LOG_MASK     = 1,
-       LAT_LOG_MASK    = 2,
-       SLAT_LOG_MASK   = 4,
-       CLAT_LOG_MASK   = 8,
-       IOPS_LOG_MASK   = 16,
-
-       ALL_LOG_MASK    = 31,
-       ALL_LOG_NR      = 5,
-};
-
-static void writeout_logs(struct thread_data *td)
-{
-       struct thread_options *o = &td->o;
-       unsigned int log_mask = ALL_LOG_MASK;
-       unsigned int log_left = ALL_LOG_NR;
-       int old_state;
-
-       old_state = td_bump_runstate(td, TD_FINISHING);
-
-       finalize_logs(td);
-
-       while (log_left) {
-               int ret, prev_log_left = log_left;
-
-               if (log_mask & BW_LOG_MASK) {
-                       ret = write_bandw_log(td, o, log_left != 1);
-                       if (!ret) {
-                               log_left--;
-                               log_mask &= ~BW_LOG_MASK;
-                       }
-               }
-               if (log_mask & LAT_LOG_MASK) {
-                       ret = write_lat_log(td, o, log_left != 1);
-                       if (!ret) {
-                               log_left--;
-                               log_mask &= ~LAT_LOG_MASK;
-                       }
-               }
-               if (log_mask & SLAT_LOG_MASK) {
-                       ret = write_slat_log(td, o, log_left != 1);
-                       if (!ret) {
-                               log_left--;
-                               log_mask &= ~SLAT_LOG_MASK;
-                       }
-               }
-               if (log_mask & CLAT_LOG_MASK) {
-                       ret = write_clat_log(td, o, log_left != 1);
-                       if (!ret) {
-                               log_left--;
-                               log_mask &= ~CLAT_LOG_MASK;
-                       }
-               }
-               if (log_mask & IOPS_LOG_MASK) {
-                       ret = write_iops_log(td, o, log_left != 1);
-                       if (!ret) {
-                               log_left--;
-                               log_mask &= ~IOPS_LOG_MASK;
-                       }
-               }
-
-               if (prev_log_left == log_left)
-                       usleep(5000);
-       }
-
-       td_restore_runstate(td, old_state);
-}
-
 /*
  * Entry point for the thread based jobs. The process based jobs end up
  * here as well, after a little setup.
@@ -1603,7 +1489,7 @@ static void *thread_main(void *data)
 
        fio_unpin_memory(td);
 
-       writeout_logs(td);
+       fio_writeout_logs(td);
 
        if (o->exec_postrun)
                exec_string(o, o->exec_postrun, (const char *)"postrun");
diff --git a/iolog.c b/iolog.c
index 8589df69176411616a62d82fd5ff2a121e89c720..1af31cb3bd30804f4754c48b9f841fd7006736f9 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -539,8 +539,9 @@ void __finish_log(struct io_log *log, const char *name)
        free(log);
 }
 
-int finish_log_named(struct thread_data *td, struct io_log *log,
-                    const char *prefix, const char *postfix, int trylock)
+static int finish_log_named(struct thread_data *td, struct io_log *log,
+                           const char *prefix, const char *postfix,
+                           int trylock)
 {
        char file_name[256];
 
@@ -563,8 +564,131 @@ int finish_log_named(struct thread_data *td, struct io_log *log,
        return 0;
 }
 
-int finish_log(struct thread_data *td, struct io_log *log, const char *name,
-              int trylock)
+static int finish_log(struct thread_data *td, struct io_log *log,
+                     const char *name, int trylock)
 {
        return finish_log_named(td, log, td->o.name, name, trylock);
 }
+
+static int write_this_log(struct thread_data *td, struct io_log *log,
+                         const char *log_file, const char *name, int try)
+{
+       int ret;
+
+       if (!log)
+               return 0;
+
+       if (log_file)
+               ret = finish_log_named(td, log, log_file, name, try);
+       else
+               ret = finish_log(td, log, name, try);
+
+       return ret;
+}
+
+static int write_iops_log(struct thread_data *td, int try)
+{
+       struct thread_options *o = &td->o;
+
+       return write_this_log(td, td->iops_log, o->iops_log_file, "iops", try);
+}
+
+static int write_slat_log(struct thread_data *td, int try)
+{
+       struct thread_options *o = &td->o;
+
+       return write_this_log(td, td->slat_log, o->lat_log_file, "slat", try);
+}
+
+static int write_clat_log(struct thread_data *td, int try)
+{
+       struct thread_options *o = &td->o;
+
+       return write_this_log(td, td->clat_log, o->lat_log_file, "clat" , try);
+}
+
+static int write_lat_log(struct thread_data *td, int try)
+{
+       struct thread_options *o = &td->o;
+
+       return write_this_log(td, td->lat_log, o->lat_log_file, "lat", try);
+}
+
+static int write_bandw_log(struct thread_data *td, int try)
+{
+       struct thread_options *o = &td->o;
+
+       return write_this_log(td, td->bw_log, o->bw_log_file, "bw", try);
+}
+
+enum {
+       BW_LOG_MASK     = 1,
+       LAT_LOG_MASK    = 2,
+       SLAT_LOG_MASK   = 4,
+       CLAT_LOG_MASK   = 8,
+       IOPS_LOG_MASK   = 16,
+
+       ALL_LOG_MASK    = 31,
+       ALL_LOG_NR      = 5,
+};
+
+struct log_type {
+       unsigned int mask;
+       int (*fn)(struct thread_data *, int);
+};
+
+static struct log_type log_types[] = {
+       {
+               .mask   = BW_LOG_MASK,
+               .fn     = write_bandw_log,
+       },
+       {
+               .mask   = LAT_LOG_MASK,
+               .fn     = write_lat_log,
+       },
+       {
+               .mask   = SLAT_LOG_MASK,
+               .fn     = write_slat_log,
+       },
+       {
+               .mask   = CLAT_LOG_MASK,
+               .fn     = write_clat_log,
+       },
+       {
+               .mask   = IOPS_LOG_MASK,
+               .fn     = write_iops_log,
+       },
+};
+
+void fio_writeout_logs(struct thread_data *td)
+{
+       unsigned int log_mask = ALL_LOG_MASK;
+       unsigned int log_left = ALL_LOG_NR;
+       int old_state, i;
+
+       old_state = td_bump_runstate(td, TD_FINISHING);
+
+       finalize_logs(td);
+
+       while (log_left) {
+               int prev_log_left = log_left;
+
+               for (i = 0; i < ALL_LOG_NR && log_left; i++) {
+                       struct log_type *lt = &log_types[i];
+                       int ret;
+
+                       if (log_mask & lt->mask) {
+                               ret = lt->fn(td, log_left != 1);
+                               if (!ret) {
+                                       log_left--;
+                                       log_mask &= ~lt->mask;
+                               }
+                       }
+               }
+
+               if (prev_log_left == log_left)
+                       usleep(5000);
+       }
+
+       td_restore_runstate(td, old_state);
+}
diff --git a/iolog.h b/iolog.h
index a2bc758efea966a391c84660b45f8d33b003e52e..50d09e26bfbe3a3abe49d1b56c414a38854b5417 100644 (file)
--- a/iolog.h
+++ b/iolog.h
@@ -131,12 +131,11 @@ extern void add_iops_sample(struct thread_data *, enum fio_ddir, unsigned int,
 extern void init_disk_util(struct thread_data *);
 extern void update_rusage_stat(struct thread_data *);
 extern void setup_log(struct io_log **, unsigned long, int);
-extern int finish_log(struct thread_data *, struct io_log *, const char *, int);
-extern int finish_log_named(struct thread_data *, struct io_log *, const char *, const char *, int);
 extern void __finish_log(struct io_log *, const char *);
 extern struct io_log *agg_io_log[DDIR_RWDIR_CNT];
 extern int write_bw_log;
 extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int);
+extern void fio_writeout_logs(struct thread_data *);
 
 static inline void init_ipo(struct io_piece *ipo)
 {