X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=blktrace.c;h=29eed50c391c422da566eb063cb2bc4863bd19a1;hp=4b5567effe6ab2624079df36284df4ad524d0f19;hb=b7e147d1552c022838f4b9d8f02c477b6f906084;hpb=8edd973d57a311d4c590d7385796bbdf111ed04c diff --git a/blktrace.c b/blktrace.c index 4b5567ef..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) { @@ -391,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)); @@ -425,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; @@ -469,6 +478,13 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) 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); @@ -494,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);