Recent changes (master)
The following changes since commit ca0a0b521e8650ed736246c00092094a4d5c9829:
t/*: missing statics (2018-04-24 14:03:34 -0600)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to 43864deb3b4e24d5570ee4cb16cb626e94ec0465:
iolog: default to good return (2018-04-26 22:45:04 -0600)
----------------------------------------------------------------
Jens Axboe (12):
blktrace: don't re-clear ipo
blktrace: ignore 0 byte writes
iolog: always use calloc() and always init both lists
blktrace: change barrier to a flush
blktrace: handle flush/sync replay
blktrace: kill zero sized write test
blktrace: add 'reply_skip' option
Makefile: ensure we kill all object files Update documentation for 'replay_skip'
blktrace: make sure to account SYNC/TRIM at load time iolog/blktrace: boolean conversion
iolog: default to good return
HOWTO | 8 +++++ Makefile | 2 +- backend.c | 2 +- blktrace.c | 94 ++++++++++++++++++++++++++++++++++++++------------------ blktrace.h | 14 ++++----- blktrace_api.h | 2 +- cconv.c | 2 ++ fio.1 | 6 ++++ iolog.c | 36 ++++++++++++---------- iolog.h | 4 +-- options.c | 48 +++++++++++++++++++++++++++++ server.h | 2 +- thread_options.h | 2 ++ 13 files changed, 162 insertions(+), 60 deletions(-)
---
Diff of recent changes:
HOWTO +8 -0
@@ -2346,6 +2346,14 @@ I/O replay Scale sector offsets down by this factor when replaying traces. +.. option:: replay_skip=str + + Sometimes it's useful to skip certain IO types in a replay trace. + This could be, for instance, eliminating the writes in the trace. + Or not replaying the trims/discards, if you are redirecting to + a device that doesn't support them. This option takes a comma + separated list of read, write, trim, sync. + Threads, processes and job synchronization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Makefile +1 -1
@@ -462,7 +462,7 @@ t/time-test: $(T_TT_OBJS) $(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_TT_OBJS) $(LIBS) clean: FORCE - @rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio FIO-VERSION-FILE *.d lib/*.d oslib/*.d crc/*.d engines/*.d profiles/*.d t/*.d config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h + @rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio FIO-VERSION-FILE *.[do] lib/*.d oslib/*.[do] crc/*.d engines/*.[do] profiles/*.[do] t/*.[do] config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h @rm -rf doc/output distclean: clean FORCE
backend.c +1 -1
@@ -1670,7 +1670,7 @@ static void *thread_main(void *data)* May alter parameters that init_io_u() will use, so we need to * do this first. */ -if (init_iolog (td)) +if (!init_iolog (td)) goto err;if (init_io_u (td))
blktrace.c +64 -30
212 lines not on this page · raw message
blktrace.h +7 -7
@@ -3,20 +3,20 @@#ifdef FIO_HAVE_BLKTRACE -int is_blktrace (const char *,int *); -int load_blktrace (struct thread_data *,const char *,int ); +bool is_blktrace (const char *,int *); +bool load_blktrace (struct thread_data *,const char *,int );#else -static inline int is_blktrace (const char *fname,int *need_swap) +static inline bool is_blktrace (const char *fname,int *need_swap) { -return 0 ; +return false; } -static inline int load_blktrace (struct thread_data *td,const char *fname, -int need_swap) +static inline bool load_blktrace (struct thread_data *td,const char *fname, +int need_swap) { -return 1 ; +return false; }#endif
blktrace_api.h +1 -1
@@ -9,7 +9,7 @@enum {BLK_TC_READ =1 <<0 ,/* reads */ BLK_TC_WRITE =1 <<1 ,/* writes */ -BLK_TC_BARRIER =1 <<2 ,/* barrier */ +BLK_TC_FLUSH =1 <<2 ,/* flush */ BLK_TC_SYNC =1 <<3 ,/* sync */ BLK_TC_QUEUE =1 <<4 ,/* queueing/merging */ BLK_TC_REQUEUE =1 <<5 ,/* requeueing */
cconv.c +2 -0
@@ -290,6 +290,7 @@ void convert_thread_options_to_cpu(struct thread_options *o, o->replay_align =le32_to_cpu (top->replay_align); o->replay_scale =le32_to_cpu (top->replay_scale); o->replay_time_scale =le32_to_cpu (top->replay_time_scale); + o->replay_skip =le32_to_cpu (top->replay_skip); o->per_job_logs =le32_to_cpu (top->per_job_logs); o->write_bw_log =le32_to_cpu (top->write_bw_log); o->write_lat_log =le32_to_cpu (top->write_lat_log);
@@ -479,6 +480,7 @@ void convert_thread_options_to_net(struct thread_options_pack *top, top->replay_align =cpu_to_le32 (o->replay_align); top->replay_scale =cpu_to_le32 (o->replay_scale); top->replay_time_scale =cpu_to_le32 (o->replay_time_scale); + top->replay_skip =cpu_to_le32 (o->replay_skip); top->per_job_logs =cpu_to_le32 (o->per_job_logs); top->write_bw_log =cpu_to_le32 (o->write_bw_log); top->write_lat_log =cpu_to_le32 (o->write_lat_log);
fio.1 +6 -0
@@ -2067,6 +2067,12 @@ value. Scale sector offsets down by this factor when replaying traces. .SS "Threads, processes and job synchronization" .TP +.BI replay_skip \fR=\fPstr +Sometimes it's useful to skip certain IO types in a replay trace. This could +be, for instance, eliminating the writes in the trace. Or not replaying the +trims/discards, if you are redirecting to a device that doesn't support them. +This option takes a comma separated list of read, write, trim, sync. +.TP .BI thread Fio defaults to creating jobs by using fork, however if this option is given, fio will create jobs by using POSIX Threads' function
iolog.c +19 -17
@@ -211,7 +211,7 @@ void log_io_piece(struct thread_data *td, struct io_u *io_u)struct fio_rb_node **p, *parent;struct io_piece *ipo, *__ipo; - ipo =malloc (sizeof (struct io_piece )); + ipo =calloc (1 ,sizeof (struct io_piece ));init_ipo (ipo); ipo->file = io_u->file; ipo->offset = io_u->offset;
@@ -338,7 +338,7 @@ void write_iolog_close(struct thread_data *td)* Read version 2 iolog data. It is enhanced to include per-file logging, * syncs, etc. */ -static int read_iolog2 (struct thread_data *td,FILE *f) +static bool read_iolog2 (struct thread_data *td,FILE *f) {unsigned long long offset;unsigned int bytes;
@@ -440,7 +440,7 @@ static int read_iolog2(struct thread_data *td, FILE *f)/* * Make note of file */ - ipo =malloc (sizeof (*ipo)); + ipo =calloc (1 ,sizeof (*ipo));init_ipo (ipo); ipo->ddir = rw;if (rw ==DDIR_WAIT ) {
@@ -474,7 +474,7 @@ static int read_iolog2(struct thread_data *td, FILE *f) }if (!reads && !writes && !waits) -return 1 ; +return false;else if (reads && !writes) td->o.td_ddir =TD_DDIR_READ ;else if (!reads && writes)
@@ -482,22 +482,22 @@ static int read_iolog2(struct thread_data *td, FILE *f)else td->o.td_ddir =TD_DDIR_RW ; -return 0 ; +return true; }/* * open iolog, check version, and call appropriate parser */ -static int init_iolog_read (struct thread_data *td) +static bool init_iolog_read (struct thread_data *td) {char buffer[256 ], *p;FILE *f; -int ret; +bool ret; f =fopen (td->o.read_iolog_file,"r" );if (!f) {perror ("fopen read iolog" ); -return 1 ; +return false; } p =fgets (buffer,sizeof (buffer), f);
@@ -505,7 +505,7 @@ static int init_iolog_read(struct thread_data *td)td_verror (td, errno,"iolog read" );log_err ("fio: unable to read iolog\n" );fclose (f); -return 1 ; +return false; }/*
@@ -516,7 +516,7 @@ static int init_iolog_read(struct thread_data *td) ret =read_iolog2 (td, f); else {log_err ("fio: iolog version 1 is no longer supported\n" ); - ret =1 ; + ret = false; }fclose (f);
@@ -526,7 +526,7 @@ static int init_iolog_read(struct thread_data *td)/* * Set up a log for storing io patterns. */ -static int init_iolog_write (struct thread_data *td) +static bool init_iolog_write (struct thread_data *td) {struct fio_file *ff;FILE *f;
@@ -535,7 +535,7 @@ static int init_iolog_write(struct thread_data *td) f =fopen (td->o.write_iolog_file,"a" );if (!f) {perror ("fopen write iolog" ); -return 1 ; +return false; }/*
@@ -550,7 +550,7 @@ static int init_iolog_write(struct thread_data *td)*/ if (fprintf (f,"%s\n" , iolog_ver2) <0 ) {perror ("iolog init\n" ); -return 1 ; +return false; }/*
@@ -559,12 +559,12 @@ static int init_iolog_write(struct thread_data *td)for_each_file (td, ff, i)log_file (td, ff,FIO_LOG_ADD_FILE ); -return 0 ; +return true; } -int init_iolog (struct thread_data *td) +bool init_iolog (struct thread_data *td) { -int ret =0 ; +bool ret;if (td->o.read_iolog_file) {int need_swap;
@@ -579,8 +579,10 @@ int init_iolog(struct thread_data *td) ret =init_iolog_read (td); }else if (td->o.write_iolog_file) ret =init_iolog_write (td); +else + ret = true; -if (ret) +if (!ret)td_verror (td,EINVAL ,"failed initializing iolog" );return ret;
iolog.h +2 -2
@@ -234,7 +234,7 @@ struct io_u;extern int __must_check read_iolog_get (struct thread_data *,struct io_u *);extern void log_io_u (const struct thread_data *,const struct io_u *);extern void log_file (struct thread_data *,struct fio_file *,enum file_log_act ); -extern int __must_check init_iolog (struct thread_data *td); +extern bool __must_check init_iolog (struct thread_data *td);extern void log_io_piece (struct thread_data *,struct io_u *);extern void unlog_io_piece (struct thread_data *,struct io_u *);extern void trim_io_piece (struct thread_data *,const struct io_u *);
@@ -296,7 +296,7 @@ extern int iolog_cur_flush(struct io_log *, struct io_logs *);static inline void init_ipo (struct io_piece *ipo) { -memset (ipo,0 ,sizeof (*ipo)); +INIT_FLIST_HEAD (&ipo->list);INIT_FLIST_HEAD (&ipo->trim_list); }
options.c +48 -0
60 lines not on this page · raw message
server.h +1 -1
@@ -48,7 +48,7 @@ struct fio_net_cmd_reply { };enum { -FIO_SERVER_VER =72 , +FIO_SERVER_VER =73 ,FIO_SERVER_MAX_FRAGMENT_PDU =1024 ,FIO_SERVER_MAX_CMD_MB =2048 ,
thread_options.h +2 -0
@@ -316,6 +316,7 @@ struct thread_options {unsigned int replay_align;unsigned int replay_scale;unsigned int replay_time_scale; +unsigned int replay_skip;unsigned int per_job_logs;
@@ -590,6 +591,7 @@ struct thread_options_pack {uint32_t replay_align;uint32_t replay_scale;uint32_t replay_time_scale; +uint32_t replay_skip;uint32_t per_job_logs;