X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=blktrace.c;h=29eed50c391c422da566eb063cb2bc4863bd19a1;hb=65bea10ffcd2a8220c65d644933d546a8a7de78d;hp=107a65b27884aacc580b5895e3ec29d02565574f;hpb=5903e7b7907854014478b6febfc5645a203ff59e;p=fio.git diff --git a/blktrace.c b/blktrace.c index 107a65b2..29eed50c 100644 --- a/blktrace.c +++ b/blktrace.c @@ -150,7 +150,7 @@ static int lookup_device(struct thread_data *td, char *path, unsigned int maj, */ if (td->o.replay_redirect) { dprint(FD_BLKTRACE, "device lookup: %d/%d\n overridden" - " with: %s", maj, min, + " with: %s\n", maj, min, td->o.replay_redirect); strcpy(path, td->o.replay_redirect); found = 1; @@ -217,6 +217,7 @@ 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->o.open_files++; td->files[fileno]->major = maj; td->files[fileno]->minor = min; trace_add_open_close_event(td, fileno, FIO_LOG_OPEN_FILE); @@ -373,6 +374,7 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) struct fifo *fifo; int fd, i, old_state; struct fio_file *f; + int this_depth, depth; fd = open(filename, O_RDONLY); if (fd < 0) { @@ -382,8 +384,7 @@ 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); + old_state = td_bump_runstate(td, TD_SETTING_UP); td->o.size = 0; @@ -392,6 +393,7 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) ios[0] = ios[1] = 0; rw_bs[0] = rw_bs[1] = 0; skipped_writes = 0; + this_depth = depth = 0; do { int ret = trace_fifo_get(td, fifo, fd, &t, sizeof(t)); @@ -426,6 +428,12 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) goto err; } if ((t.action & BLK_TC_ACT(BLK_TC_NOTIFY)) == 0) { + if ((t.action & 0xffff) == __BLK_TA_QUEUE) + this_depth++; + else if ((t.action & 0xffff) == __BLK_TA_COMPLETE) { + depth = max(depth, this_depth); + this_depth = 0; + } if (!ttime) { ttime = t.time; cpu = t.cpu; @@ -463,13 +471,20 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) fifo_free(fifo); close(fd); - td_set_runstate(td, old_state); + td_restore_runstate(td, old_state); if (!td->files_index) { log_err("fio: did not find replay device(s)\n"); return 1; } + /* + * For stacked devices, we don't always get a COMPLETE event so + * the depth grows to insane values. Limit it to something sane(r). + */ + if (!depth || depth > 1024) + depth = 1024; + if (skipped_writes) log_err("fio: %s skips replay of %lu writes due to read-only\n", td->o.name, skipped_writes); @@ -495,6 +510,13 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) */ td->o.odirect = 1; + /* + * we don't know if this option was set or not. it defaults to 1, + * so we'll just guess that we should override it if it's still 1 + */ + if (td->o.iodepth != 1) + td->o.iodepth = depth; + return 0; err: close(fd);