From 905e3d4ff8d01a4402186e1ad1f5f1fbbb6b7ef4 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 2 Apr 2014 20:01:27 -0600 Subject: [PATCH] Cleanup the parallellized log writing And move it all to iolog.c, this means we can un-export some of the log functions, too. Signed-off-by: Jens Axboe --- backend.c | 116 +---------------------------------------------- iolog.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- iolog.h | 3 +- 3 files changed, 130 insertions(+), 121 deletions(-) diff --git a/backend.c b/backend.c index 5e7a388b..5ac36592 100644 --- 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 8589df69..1af31cb3 100644 --- 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 a2bc758e..50d09e26 100644 --- 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) { -- 2.25.1