X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=blktrace.c;h=649cb83e702654c5d2f9267b3b992469b718a183;hb=3b5fea35f499c68cc56d03178a275656f2b4dc1b;hp=9e4e5998a73246cfa9a1df5e2adb2926777c056b;hpb=f01b34ae759afccf39c1bf47972e45d91448e7bb;p=fio.git diff --git a/blktrace.c b/blktrace.c index 9e4e5998..649cb83e 100644 --- a/blktrace.c +++ b/blktrace.c @@ -217,6 +217,8 @@ 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->files[fileno]->major = maj; + td->files[fileno]->minor = min; trace_add_open_close_event(td, fileno, FIO_LOG_OPEN_FILE); last_fileno = fileno; } @@ -369,8 +371,9 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) unsigned int cpu; unsigned int rw_bs[2]; struct fifo *fifo; - int fd, i; + int fd, i, old_state; struct fio_file *f; + int this_depth, depth; fd = open(filename, O_RDONLY); if (fd < 0) { @@ -380,6 +383,8 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) fifo = fifo_alloc(TRACE_FIFO_SIZE); + old_state = td_bump_runstate(td, TD_SETTING_UP); + td->o.size = 0; cpu = 0; @@ -387,6 +392,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)); @@ -421,6 +427,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; @@ -458,11 +470,20 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) fifo_free(fifo); close(fd); + 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); @@ -488,6 +509,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);