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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to