The following changes since commit 01cfefcc6255420a9e19d5774053ed2fb705b150: client/backend: fix incomplete output_format checks (2015-10-27 18:34:33 +0900) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to 09c782bbe1c62d016c8b165f304c7085a7ff9ffd: Update documentation for mmapshared (MMAP_SHARED) (2015-10-28 14:04:24 +0900) ---------------------------------------------------------------- Jens Axboe (4): Fixup -Wshadow warnings Merge branch 'mmap_shared' of git://github.com/lsgunth/fio Fixup bw/iops logging for short runs Update documentation for mmapshared (MMAP_SHARED) Logan Gunthorpe (1): Add mmapshared option to use mmaped files with the MAP_SHARED flag. HOWTO | 3 +++ backend.c | 29 +++++++++++++++-------------- engines/mmap.c | 4 ++-- engines/mtd.c | 4 ++-- filesetup.c | 2 +- fio.1 | 3 +++ fio.h | 2 +- libfio.c | 31 +++++++++++++++++-------------- memory.c | 10 +++++++--- options.c | 7 ++++++- stat.c | 2 +- t/btrace2fio.c | 4 ++-- thread_options.h | 1 + workqueue.c | 2 +- 14 files changed, 62 insertions(+), 42 deletions(-) --- Diff of recent changes: diff --git a/HOWTO b/HOWTO index 40233bd..81217b7 100644 --- a/HOWTO +++ b/HOWTO @@ -1177,6 +1177,9 @@ mem=str Fio can use various types of memory as the io unit buffer. backing. Append filename after mmaphuge, ala mem=mmaphuge:/hugetlbfs/file + mmapshared Same as mmap, but use a MMAP_SHARED + mapping. + The area allocated is a function of the maximum allowed bs size for the job, multiplied by the io depth given. Note that for shmhuge and mmaphuge to work, the system must have diff --git a/backend.c b/backend.c index b180196..0a42da3 100644 --- a/backend.c +++ b/backend.c @@ -1559,27 +1559,28 @@ static void *thread_main(void *data) fio_gettime(&td->epoch, NULL); fio_getrusage(&td->ru_start); + memcpy(&td->bw_sample_time, &td->epoch, sizeof(td->epoch)); + memcpy(&td->iops_sample_time, &td->epoch, sizeof(td->epoch)); + + if (o->ratemin[DDIR_READ] || o->ratemin[DDIR_WRITE] || + o->ratemin[DDIR_TRIM]) { + memcpy(&td->lastrate[DDIR_READ], &td->bw_sample_time, + sizeof(td->bw_sample_time)); + memcpy(&td->lastrate[DDIR_WRITE], &td->bw_sample_time, + sizeof(td->bw_sample_time)); + memcpy(&td->lastrate[DDIR_TRIM], &td->bw_sample_time, + sizeof(td->bw_sample_time)); + } + clear_state = 0; while (keep_running(td)) { uint64_t verify_bytes; fio_gettime(&td->start, NULL); - memcpy(&td->bw_sample_time, &td->start, sizeof(td->start)); - memcpy(&td->iops_sample_time, &td->start, sizeof(td->start)); memcpy(&td->tv_cache, &td->start, sizeof(td->start)); - if (o->ratemin[DDIR_READ] || o->ratemin[DDIR_WRITE] || - o->ratemin[DDIR_TRIM]) { - memcpy(&td->lastrate[DDIR_READ], &td->bw_sample_time, - sizeof(td->bw_sample_time)); - memcpy(&td->lastrate[DDIR_WRITE], &td->bw_sample_time, - sizeof(td->bw_sample_time)); - memcpy(&td->lastrate[DDIR_TRIM], &td->bw_sample_time, - sizeof(td->bw_sample_time)); - } - if (clear_state) - clear_io_state(td); + clear_io_state(td, 0); prune_io_piece_log(td); @@ -1617,7 +1618,7 @@ static void *thread_main(void *data) (td->io_ops->flags & FIO_UNIDIR)) continue; - clear_io_state(td); + clear_io_state(td, 0); fio_gettime(&td->start, NULL); diff --git a/engines/mmap.c b/engines/mmap.c index 69add78..14e4013 100644 --- a/engines/mmap.c +++ b/engines/mmap.c @@ -242,8 +242,8 @@ static int fio_mmapio_open_file(struct thread_data *td, struct fio_file *f) fmd = calloc(1, sizeof(*fmd)); if (!fmd) { - int fio_unused ret; - ret = generic_close_file(td, f); + int fio_unused __ret; + __ret = generic_close_file(td, f); return 1; } diff --git a/engines/mtd.c b/engines/mtd.c index db9c539..9381089 100644 --- a/engines/mtd.c +++ b/engines/mtd.c @@ -152,8 +152,8 @@ err_free: free(fmd); err_close: { - int fio_unused ret; - ret = generic_close_file(td, f); + int fio_unused __ret; + __ret = generic_close_file(td, f); return 1; } } diff --git a/filesetup.c b/filesetup.c index 634d556..b5628ce 100644 --- a/filesetup.c +++ b/filesetup.c @@ -917,7 +917,7 @@ int setup_files(struct thread_data *td) } td->ts.nr_block_infos = len; - for (int i = 0; i < len; i++) + for (i = 0; i < len; i++) td->ts.block_infos[i] = BLOCK_INFO(0, BLOCK_STATE_UNINIT); } else diff --git a/fio.1 b/fio.1 index 2ba36f9..3bd3318 100644 --- a/fio.1 +++ b/fio.1 @@ -1084,6 +1084,9 @@ is given after the option in the format `:\fIfile\fR'. .TP .B mmaphuge Same as \fBmmap\fR, but use huge files as backing. +.TP +.B mmapshared +Same as \fBmmap\fR, but use a MMAP_SHARED mapping. .RE .P The amount of memory allocated is the maximum allowed \fBblocksize\fR for the diff --git a/fio.h b/fio.h index 2dc445e..8daf975 100644 --- a/fio.h +++ b/fio.h @@ -464,7 +464,7 @@ extern int parse_jobs_ini(char *, int, int, int); extern int parse_cmd_line(int, char **, int); extern int fio_backend(void); extern void reset_fio_state(void); -extern void clear_io_state(struct thread_data *); +extern void clear_io_state(struct thread_data *, int); extern int fio_options_parse(struct thread_data *, char **, int, int); extern void fio_keywords_init(void); extern void fio_keywords_exit(void); diff --git a/libfio.c b/libfio.c index d4cad3e..09591a1 100644 --- a/libfio.c +++ b/libfio.c @@ -77,21 +77,24 @@ static const char *fio_arch_strings[arch_nr] = { "generic" }; -static void reset_io_counters(struct thread_data *td) +static void reset_io_counters(struct thread_data *td, int all) { int ddir; - for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) { - td->stat_io_bytes[ddir] = 0; - td->this_io_bytes[ddir] = 0; - td->stat_io_blocks[ddir] = 0; - td->this_io_blocks[ddir] = 0; - td->rate_bytes[ddir] = 0; - td->rate_blocks[ddir] = 0; - td->bytes_done[ddir] = 0; - td->rate_io_issue_bytes[ddir] = 0; - td->rate_next_io_time[ddir] = 0; + if (all) { + for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) { + td->stat_io_bytes[ddir] = 0; + td->this_io_bytes[ddir] = 0; + td->stat_io_blocks[ddir] = 0; + td->this_io_blocks[ddir] = 0; + td->rate_bytes[ddir] = 0; + td->rate_blocks[ddir] = 0; + td->bytes_done[ddir] = 0; + td->rate_io_issue_bytes[ddir] = 0; + td->rate_next_io_time[ddir] = 0; + } } + td->zone_bytes = 0; td->last_was_sync = 0; @@ -104,12 +107,12 @@ static void reset_io_counters(struct thread_data *td) td->nr_done_files = 0; } -void clear_io_state(struct thread_data *td) +void clear_io_state(struct thread_data *td, int all) { struct fio_file *f; unsigned int i; - reset_io_counters(td); + reset_io_counters(td, all); close_files(td); for_each_file(td, f, i) { @@ -129,7 +132,7 @@ void reset_all_stats(struct thread_data *td) struct timeval tv; int i; - reset_io_counters(td); + reset_io_counters(td, 1); for (i = 0; i < DDIR_RWDIR_CNT; i++) { td->io_bytes[i] = 0; diff --git a/memory.c b/memory.c index 23a0d94..5060223 100644 --- a/memory.c +++ b/memory.c @@ -146,12 +146,14 @@ static int alloc_mem_mmap(struct thread_data *td, size_t total_mem) return 1; } if (td->o.mem_type != MEM_MMAPHUGE && + td->o.mem_type != MEM_MMAPSHARED && ftruncate(td->mmapfd, total_mem) < 0) { td_verror(td, errno, "truncate mmap file"); td->orig_buffer = NULL; return 1; } - if (td->o.mem_type == MEM_MMAPHUGE) + if (td->o.mem_type == MEM_MMAPHUGE || + td->o.mem_type == MEM_MMAPSHARED) flags |= MAP_SHARED; else flags |= MAP_PRIVATE; @@ -231,7 +233,8 @@ int allocate_io_mem(struct thread_data *td) ret = alloc_mem_malloc(td, total_mem); else if (td->o.mem_type == MEM_SHM || td->o.mem_type == MEM_SHMHUGE) ret = alloc_mem_shm(td, total_mem); - else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE) + else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE || + td->o.mem_type == MEM_MMAPSHARED) ret = alloc_mem_mmap(td, total_mem); else { log_err("fio: bad mem type: %d\n", td->o.mem_type); @@ -256,7 +259,8 @@ void free_io_mem(struct thread_data *td) free_mem_malloc(td); else if (td->o.mem_type == MEM_SHM || td->o.mem_type == MEM_SHMHUGE) free_mem_shm(td); - else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE) + else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE || + td->o.mem_type == MEM_MMAPSHARED) free_mem_mmap(td, total_mem); else log_err("Bad memory type %u\n", td->o.mem_type); diff --git a/options.c b/options.c index 0169ca2..5584413 100644 --- a/options.c +++ b/options.c @@ -351,7 +351,8 @@ static int str_mem_cb(void *data, const char *mem) { struct thread_data *td = data; - if (td->o.mem_type == MEM_MMAPHUGE || td->o.mem_type == MEM_MMAP) + if (td->o.mem_type == MEM_MMAPHUGE || td->o.mem_type == MEM_MMAP || + td->o.mem_type == MEM_MMAPSHARED) td->o.mmapfile = get_opt_postfix(mem); return 0; @@ -2228,6 +2229,10 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .oval = MEM_MMAP, .help = "Use mmap(2) (file or anon) for IO buffers", }, + { .ival = "mmapshared", + .oval = MEM_MMAPSHARED, + .help = "Like mmap, but use the shared flag", + }, #ifdef FIO_HAVE_HUGETLB { .ival = "mmaphuge", .oval = MEM_MMAPHUGE, diff --git a/stat.c b/stat.c index 2a65fed..091d6fb 100644 --- a/stat.c +++ b/stat.c @@ -1173,7 +1173,7 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts, if (len) { struct json_object *block, *percentile_object, *states; - int state, i; + int state; block = json_create_object(); json_object_add_value_object(root, "block", block); diff --git a/t/btrace2fio.c b/t/btrace2fio.c index d0b7e09..04b6abe 100644 --- a/t/btrace2fio.c +++ b/t/btrace2fio.c @@ -937,14 +937,14 @@ static int merge_entries(struct btrace_pid *pida, struct btrace_pid *pidb) return 1; } -static void check_merges(struct btrace_pid *p, struct flist_head *pid_list) +static void check_merges(struct btrace_pid *p, struct flist_head *pidlist) { struct flist_head *e, *tmp; if (p->ignore) return; - flist_for_each_safe(e, tmp, pid_list) { + flist_for_each_safe(e, tmp, pidlist) { struct btrace_pid *pidb; pidb = flist_entry(e, struct btrace_pid, pid_list); diff --git a/thread_options.h b/thread_options.h index 5ef560e..ed960ee 100644 --- a/thread_options.h +++ b/thread_options.h @@ -19,6 +19,7 @@ enum fio_memtype { MEM_SHMHUGE, /* use shared memory segments with huge pages */ MEM_MMAP, /* use anonynomous mmap */ MEM_MMAPHUGE, /* memory mapped huge file */ + MEM_MMAPSHARED, /* use mmap with shared flag */ }; #define ERROR_STR_MAX 128 diff --git a/workqueue.c b/workqueue.c index 60e6ab2..7a69be2 100644 --- a/workqueue.c +++ b/workqueue.c @@ -186,7 +186,7 @@ static int init_submit_worker(struct submit_worker *sw) fio_gettime(&td->epoch, NULL); fio_getrusage(&td->ru_start); - clear_io_state(td); + clear_io_state(td, 1); td_set_runstate(td, TD_RUNNING); td->flags |= TD_F_CHILD; -- 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