The following changes since commit bcd27f7ae1ccebd2ac1778752bf8f13fa99600e9: Fixup ->open_files if not given (2014-02-25 14:01:26 -0800) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to 225ba9e3433cf27d8ff7b213d9f78b7ef2776c70: Branch and cache miss speedups (2014-02-26 14:31:15 -0800) ---------------------------------------------------------------- Jens Axboe (2): blktrace: load improvements Branch and cache miss speedups blktrace.c | 9 ++++++++- compiler/compiler.h | 2 ++ engines/net.c | 2 +- engines/rbd.c | 2 +- file.h | 2 +- filesetup.c | 12 +++++++----- gettime.c | 2 +- init.c | 4 ++-- io_u.c | 2 +- ioengine.h | 38 +++++++++++++++++++------------------- iolog.c | 3 +-- lib/lfsr.c | 9 ++++----- options.c | 3 +-- 13 files changed, 49 insertions(+), 41 deletions(-) --- Diff of recent changes: diff --git a/blktrace.c b/blktrace.c index 9e4e599..107a65b 100644 --- a/blktrace.c +++ b/blktrace.c @@ -217,6 +217,8 @@ static int trace_add_file(struct thread_data *td, __u32 device) dprint(FD_BLKTRACE, "add devices %s\n", dev); fileno = add_file_exclusive(td, dev); + td->files[fileno]->major = maj; + td->files[fileno]->minor = min; trace_add_open_close_event(td, fileno, FIO_LOG_OPEN_FILE); last_fileno = fileno; } @@ -369,7 +371,7 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) unsigned int cpu; unsigned int rw_bs[2]; struct fifo *fifo; - int fd, i; + int fd, i, old_state; struct fio_file *f; fd = open(filename, O_RDONLY); @@ -380,6 +382,9 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) fifo = fifo_alloc(TRACE_FIFO_SIZE); + old_state = td->runstate; + td_set_runstate(td, TD_SETTING_UP); + td->o.size = 0; cpu = 0; @@ -458,6 +463,8 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) fifo_free(fifo); close(fd); + td_set_runstate(td, old_state); + if (!td->files_index) { log_err("fio: did not find replay device(s)\n"); return 1; diff --git a/compiler/compiler.h b/compiler/compiler.h index 036ba20..0a0213b 100644 --- a/compiler/compiler.h +++ b/compiler/compiler.h @@ -20,4 +20,6 @@ #define fio_init __attribute__((constructor)) #define fio_exit __attribute__((destructor)) +#define fio_unlikely(x) __builtin_expect(!!(x), 0) + #endif diff --git a/engines/net.c b/engines/net.c index dd06861..1df8d06 100644 --- a/engines/net.c +++ b/engines/net.c @@ -1194,7 +1194,7 @@ static int fio_netio_setup(struct thread_data *td) struct netio_data *nd; if (!td->files_index) { - add_file(td, td->o.filename ?: "net", 0); + add_file(td, td->o.filename ?: "net", 0, 0); td->o.nr_files = td->o.nr_files ?: 1; } diff --git a/engines/rbd.c b/engines/rbd.c index 39fa0ce..5a4a3e2 100644 --- a/engines/rbd.c +++ b/engines/rbd.c @@ -377,7 +377,7 @@ static int fio_rbd_setup(struct thread_data *td) * The size of the RBD is set instead of a artificial file. */ if (!td->files_index) { - add_file(td, td->o.filename ? : "rbd", 0); + add_file(td, td->o.filename ? : "rbd", 0, 0); td->o.nr_files = td->o.nr_files ? : 1; } f = td->files[0]; diff --git a/file.h b/file.h index d065a25..c929d1d 100644 --- a/file.h +++ b/file.h @@ -167,7 +167,7 @@ extern int __must_check generic_close_file(struct thread_data *, struct fio_file extern int __must_check generic_get_file_size(struct thread_data *, struct fio_file *); extern int __must_check file_lookup_open(struct fio_file *f, int flags); extern int __must_check pre_read_files(struct thread_data *); -extern int add_file(struct thread_data *, const char *, int); +extern int add_file(struct thread_data *, const char *, int, int); extern int add_file_exclusive(struct thread_data *, const char *); extern void get_file(struct fio_file *); extern int __must_check put_file(struct thread_data *, struct fio_file *); diff --git a/filesetup.c b/filesetup.c index 7669d70..2744d4f 100644 --- a/filesetup.c +++ b/filesetup.c @@ -1010,7 +1010,7 @@ int init_random_map(struct thread_data *td) seed = td->rand_seeds[FIO_RAND_BLOCK_OFF]; - if (!lfsr_init(&f->lfsr, blocks, seed, seed & 0xF)) + if (!lfsr_init(&f->lfsr, blocks, seed, 0)) continue; } else if (!td->o.norandommap) { f->io_axmap = axmap_new(blocks); @@ -1145,7 +1145,7 @@ static void free_already_allocated() { } } -int add_file(struct thread_data *td, const char *fname, int numjob) +int add_file(struct thread_data *td, const char *fname, int numjob, int inc) { int cur_files = td->files_index; char file_name[PATH_MAX]; @@ -1237,6 +1237,9 @@ int add_file(struct thread_data *td, const char *fname, int numjob) if (!td->o.open_files) td->o.open_files = 1; + if (inc) + td->o.nr_files++; + dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, cur_files); @@ -1253,7 +1256,7 @@ int add_file_exclusive(struct thread_data *td, const char *fname) return i; } - return add_file(td, fname, 0); + return add_file(td, fname, 0, 1); } void get_file(struct fio_file *f) @@ -1362,8 +1365,7 @@ static int recurse_dir(struct thread_data *td, const char *dirname) } if (S_ISREG(sb.st_mode)) { - add_file(td, full_path, 0); - td->o.nr_files++; + add_file(td, full_path, 0, 1); continue; } if (!S_ISDIR(sb.st_mode)) diff --git a/gettime.c b/gettime.c index 277f2cf..8991703 100644 --- a/gettime.c +++ b/gettime.c @@ -205,7 +205,7 @@ void fio_gettime(struct timeval *tp, void fio_unused *caller) gtod_log_caller(caller); #endif - if (fio_tv) { + if (fio_unlikely(fio_tv)) { memcpy(tp, fio_tv, sizeof(*tp)); return; } diff --git a/init.c b/init.c index 6a65e55..73ec9eb 100644 --- a/init.c +++ b/init.c @@ -1026,10 +1026,10 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, file_alloced = 1; if (o->nr_files == 1 && exists_and_not_file(jobname)) - add_file(td, jobname, job_add_num); + add_file(td, jobname, job_add_num, 0); else { for (i = 0; i < o->nr_files; i++) - add_file(td, make_filename(fname, o, jobname, job_add_num, i), job_add_num); + add_file(td, make_filename(fname, o, jobname, job_add_num, i), job_add_num, 0); } } diff --git a/io_u.c b/io_u.c index a69efb7..77557df 100644 --- a/io_u.c +++ b/io_u.c @@ -1307,9 +1307,9 @@ again: else if (!queue_full(td)) { io_u = io_u_qpop(&td->io_u_freelist); + io_u->file = NULL; io_u->buflen = 0; io_u->resid = 0; - io_u->file = NULL; io_u->end_io = NULL; } diff --git a/ioengine.h b/ioengine.h index abf2b46..7e0707b 100644 --- a/ioengine.h +++ b/ioengine.h @@ -73,6 +73,25 @@ struct io_u { struct io_piece *ipo; + unsigned int resid; + unsigned int error; + + /* + * io engine private data + */ + union { + unsigned int index; + unsigned int seen; + void *engine_data; + }; + + struct flist_head verify_list; + + /* + * Callback for io completion + */ + int (*end_io)(struct thread_data *, struct io_u *); + union { #ifdef CONFIG_LIBAIO struct iocb iocb; @@ -97,25 +116,6 @@ struct io_u { #endif void *mmap_data; }; - - unsigned int resid; - unsigned int error; - - /* - * io engine private data - */ - union { - unsigned int index; - unsigned int seen; - void *engine_data; - }; - - struct flist_head verify_list; - - /* - * Callback for io completion - */ - int (*end_io)(struct thread_data *, struct io_u *); }; /* diff --git a/iolog.c b/iolog.c index eeaca29..b8ee067 100644 --- a/iolog.c +++ b/iolog.c @@ -323,8 +323,7 @@ static int read_iolog2(struct thread_data *td, FILE *f) } else if (r == 2) { rw = DDIR_INVAL; if (!strcmp(act, "add")) { - td->o.nr_files++; - fileno = add_file(td, fname, 0); + fileno = add_file(td, fname, 0, 1); file_action = FIO_LOG_ADD_FILE; continue; } else if (!strcmp(act, "open")) { diff --git a/lib/lfsr.c b/lib/lfsr.c index 927b2a1..9771318 100644 --- a/lib/lfsr.c +++ b/lib/lfsr.c @@ -2,6 +2,7 @@ #include <math.h> #include "lfsr.h" +#include "../compiler/compiler.h" /* * LFSR taps retrieved from: @@ -132,11 +133,9 @@ int lfsr_next(struct fio_lfsr *fl, uint64_t *off, uint64_t last) if (fl->cycle_length && !--fl->cycle_length) { __lfsr_next(fl, fl->spin + 1); fl->cycle_length = fl->cached_cycle_length; - goto check; - } - __lfsr_next(fl, fl->spin); -check: ; - } while (fl->last_val > fl->max_val); + } else + __lfsr_next(fl, fl->spin); + } while (fio_unlikely(fl->last_val > fl->max_val)); *off = fl->last_val; return 0; diff --git a/options.c b/options.c index 625d3a2..6d3956e 100644 --- a/options.c +++ b/options.c @@ -827,8 +827,7 @@ static int str_filename_cb(void *data, const char *input) while ((fname = get_next_name(&str)) != NULL) { if (!strlen(fname)) break; - add_file(td, fname, 0); - td->o.nr_files++; + add_file(td, fname, 0, 1); } free(p); -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html