Recent changes (master)

Jens Axboe
2016-12-13T13:00:05Z

The following changes since commit 487197d9e8f3aa0f135a6d88e5f222a1a930723a:

mmap engine: remove unused variable mmap_map_mask (2016-12-05 09:48:08 -0700)

are available in the git repository at:

git://git.kernel.dk/fio.git master

for you to fetch changes up to a79f17bf3bfa20b83424c2301de092bdcfbaaea4:

iolog: add support for replay_scale option (2016-12-12 22:23:28 +0000)

----------------------------------------------------------------
Sitsofe Wheeler (3):
iolog: Ignore re-add/re-open with replay_redirect
blktrace: Fix replay_align 32 bit truncation
iolog: add support for replay_scale option

blktrace.c | 13 ++-----------
iolog.c | 22 +++++++++++++++++++---
iolog.h | 8 ++++++++
3 files changed, 29 insertions(+), 14 deletions(-)

---

Diff of recent changes:

diff --git a/blktrace.c b/blktrace.c
index deb8b2d..a3474cb 100644
--- a/blktrace.c
+++ b/blktrace.c
@@ -216,15 +216,6 @@ static void t_bytes_align(struct thread_options *o, struct blk_io_trace *t)
t->bytes = (t->bytes + o->replay_align - 1) & ~(o->replay_align - 1);
}

-static void ipo_bytes_align(struct thread_options *o, struct io_piece *ipo)
-{
- if (!o->replay_align)
- return;
-
- ipo->offset &= ~(o->replay_align - 1);
-}
-
-
/*
* Store blk_io_trace data in an ipo for later retrieval.
*/
@@ -239,7 +230,7 @@ static void store_ipo(struct thread_data *td, unsigned long long offset,
ipo->offset = offset * bs;
if (td->o.replay_scale)
ipo->offset = ipo->offset / td->o.replay_scale;
- ipo_bytes_align(&td->o, ipo);
+ ipo_bytes_align(td->o.replay_align, ipo);
ipo->len = bytes;
ipo->delay = ttime / 1000;
if (rw)
@@ -297,7 +288,7 @@ static void handle_trace_discard(struct thread_data *td,
ipo->offset = t->sector * bs;
if (td->o.replay_scale)
ipo->offset = ipo->offset / td->o.replay_scale;
- ipo_bytes_align(&td->o, ipo);
+ ipo_bytes_align(td->o.replay_align, ipo);
ipo->len = t->bytes;
ipo->delay = ttime / 1000;
ipo->ddir = DDIR_TRIM;
diff --git a/iolog.c b/iolog.c
index 2bc3e3a..9393890 100644
--- a/iolog.c
+++ b/iolog.c
@@ -109,6 +109,11 @@ static int ipo_special(struct thread_data *td, struct io_piece *ipo)

switch (ipo->file_action) {
case FIO_LOG_OPEN_FILE:
+ if (td->o.replay_redirect && fio_file_open(f)) {
+ dprint(FD_FILE, "iolog: ignoring re-open of file %s\n",
+ f->file_name);
+ break;
+ }
ret = td_io_open_file(td, f);
if (!ret)
break;
@@ -396,8 +401,14 @@ static int read_iolog2(struct thread_data *td, FILE *f)
} else if (r == 2) {
rw = DDIR_INVAL;
if (!strcmp(act, "add")) {
- fileno = add_file(td, fname, 0, 1);
- file_action = FIO_LOG_ADD_FILE;
+ if (td->o.replay_redirect &&
+ get_fileno(td, fname) != -1) {
+ dprint(FD_FILE, "iolog: ignoring"
+ " re-add of file %s\n", fname);
+ } else {
+ fileno = add_file(td, fname, 0, 1);
+ file_action = FIO_LOG_ADD_FILE;
+ }
continue;
} else if (!strcmp(act, "open")) {
fileno = get_fileno(td, fname);
@@ -443,7 +454,12 @@ static int read_iolog2(struct thread_data *td, FILE *f)
if (rw == DDIR_WAIT) {
ipo->delay = offset;
} else {
- ipo->offset = offset;
+ if (td->o.replay_scale)
+ ipo->offset = offset / td->o.replay_scale;
+ else
+ ipo->offset = offset;
+ ipo_bytes_align(td->o.replay_align, ipo);
+
ipo->len = bytes;
if (rw != DDIR_INVAL && bytes > td->o.max_bs[rw])
td->o.max_bs[rw] = bytes;
diff --git a/iolog.h b/iolog.h
index ee28944..60ee3e9 100644
--- a/iolog.h
+++ b/iolog.h
@@ -269,6 +269,14 @@ static inline bool inline_log(struct io_log *log)
log->log_type == IO_LOG_TYPE_SLAT;
}

+static inline void ipo_bytes_align(unsigned int replay_align, struct io_piece *ipo)
+{
+ if (replay_align)
+ return;
+
+ ipo->offset &= ~(replay_align - (uint64_t)1);
+}
+
extern void finalize_logs(struct thread_data *td, bool);
extern void setup_log(struct io_log **, struct log_params *, const char *);
extern void flush_log(struct io_log *, bool);