io_u: re-invalidate cache when looping around without file open/close
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index db043e4acce6a5c6b81a216caed5eba6ca2d587a..4246edff0b2ffe19242dace14d4271ba851c7856 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -37,7 +37,7 @@ static bool random_map_free(struct fio_file *f, const uint64_t block)
  */
 static void mark_random_map(struct thread_data *td, struct io_u *io_u)
 {
-       unsigned int min_bs = td->o.rw_min_bs;
+       unsigned int min_bs = td->o.min_bs[io_u->ddir];
        struct fio_file *f = io_u->file;
        unsigned int nr_blocks;
        uint64_t block;
@@ -323,6 +323,17 @@ fetch:
        goto fetch;
 }
 
+static void loop_cache_invalidate(struct thread_data *td, struct fio_file *f)
+{
+       struct thread_options *o = &td->o;
+
+       if (o->invalidate_cache && !o->odirect) {
+               int fio_unused ret;
+
+               ret = file_invalidate_cache(td, f);
+       }
+}
+
 static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
                               enum fio_ddir ddir, uint64_t *b)
 {
@@ -334,6 +345,7 @@ static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
                fio_file_reset(td, f);
                if (!get_next_rand_offset(td, f, ddir, b))
                        return 0;
+               loop_cache_invalidate(td, f);
        }
 
        dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
@@ -358,6 +370,8 @@ static int get_next_seq_offset(struct thread_data *td, struct fio_file *f,
                        f->last_pos[ddir] = 0;
                else
                        f->last_pos[ddir] = f->last_pos[ddir] - io_size;
+
+               loop_cache_invalidate(td, f);
        }
 
        if (f->last_pos[ddir] < f->real_file_size) {
@@ -662,7 +676,7 @@ int io_u_quiesce(struct thread_data *td)
 static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir)
 {
        enum fio_ddir odir = ddir ^ 1;
-       long usec;
+       uint64_t usec;
        uint64_t now;
 
        assert(ddir_rw(ddir));
@@ -1779,7 +1793,7 @@ static void account_io_completion(struct thread_data *td, struct io_u *io_u,
        if (td->parent)
                td = td->parent;
 
-       if (!td->o.stats)
+       if (!td->o.stats || td_ioengine_flagged(td, FIO_NOSTATS))
                return;
 
        if (no_reduce)