X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=blktrace.c;h=65b600f5cfed020c2008e3c77511829fcd4cf02b;hp=bb0bcbe60ac52e2f7f6c1fda34983f704e94ada0;hb=f5c5f8692962c83e4c1817ac1899f325853e3e0f;hpb=76a00ec6684317902e536365b89531431e7f8867 diff --git a/blktrace.c b/blktrace.c index bb0bcbe6..65b600f5 100644 --- a/blktrace.c +++ b/blktrace.c @@ -4,12 +4,15 @@ #include #include #include +#include +#include #include #include "flist.h" #include "fio.h" +#include "blktrace.h" #include "blktrace_api.h" -#include "lib/linux-dev-lookup.h" +#include "oslib/linux-dev-lookup.h" #define TRACE_FIFO_SIZE 8192 @@ -127,17 +130,37 @@ static void trace_add_open_close_event(struct thread_data *td, int fileno, enum flist_add_tail(&ipo->list, &td->io_log_list); } -static int trace_add_file(struct thread_data *td, __u32 device) +static int get_dev_blocksize(const char *dev, unsigned int *bs) { - static unsigned int last_maj, last_min, last_fileno; + int fd; + + fd = open(dev, O_RDONLY); + if (fd < 0) + return 1; + + if (ioctl(fd, BLKSSZGET, bs) < 0) { + close(fd); + return 1; + } + + close(fd); + return 0; +} + +static int trace_add_file(struct thread_data *td, __u32 device, + unsigned int *bs) +{ + static unsigned int last_maj, last_min, last_fileno, last_bs; unsigned int maj = FMAJOR(device); unsigned int min = FMINOR(device); struct fio_file *f; - char dev[256]; unsigned int i; + char dev[256]; - if (last_maj == maj && last_min == min) + if (last_maj == maj && last_min == min) { + *bs = last_bs; return last_fileno; + } last_maj = maj; last_min = min; @@ -145,14 +168,17 @@ static int trace_add_file(struct thread_data *td, __u32 device) /* * check for this file in our list */ - for_each_file(td, f, i) + for_each_file(td, f, i) { if (f->major == maj && f->minor == min) { last_fileno = f->fileno; - return last_fileno; + last_bs = f->bs; + goto out; } + } strcpy(dev, "/dev"); if (blktrace_lookup_device(td->o.replay_redirect, dev, maj, min)) { + unsigned int this_bs; int fileno; if (td->o.replay_redirect) @@ -164,31 +190,48 @@ 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); + + if (get_dev_blocksize(dev, &this_bs)) + this_bs = 512; + td->o.open_files++; td->files[fileno]->major = maj; td->files[fileno]->minor = min; + td->files[fileno]->bs = this_bs; trace_add_open_close_event(td, fileno, FIO_LOG_OPEN_FILE); + last_fileno = fileno; + last_bs = this_bs; } +out: + *bs = last_bs; return last_fileno; } +static void t_bytes_align(struct thread_options *o, struct blk_io_trace *t) +{ + if (!o->replay_align) + return; + + t->bytes = (t->bytes + o->replay_align - 1) & ~(o->replay_align - 1); +} + /* * Store blk_io_trace data in an ipo for later retrieval. */ static void store_ipo(struct thread_data *td, unsigned long long offset, unsigned int bytes, int rw, unsigned long long ttime, - int fileno) + int fileno, unsigned int bs) { struct io_piece *ipo = malloc(sizeof(*ipo)); init_ipo(ipo); - /* - * the 512 is wrong here, it should be the hardware sector size... - */ - ipo->offset = offset * 512; + ipo->offset = offset * bs; + if (td->o.replay_scale) + ipo->offset = ipo->offset / td->o.replay_scale; + ipo_bytes_align(td->o.replay_align, ipo); ipo->len = bytes; ipo->delay = ttime / 1000; if (rw) @@ -225,27 +268,28 @@ static void handle_trace_notify(struct blk_io_trace *t) static void handle_trace_discard(struct thread_data *td, struct blk_io_trace *t, unsigned long long ttime, - unsigned long *ios, unsigned int *bs) + unsigned long *ios, unsigned int *rw_bs) { struct io_piece *ipo = malloc(sizeof(*ipo)); + unsigned int bs; int fileno; init_ipo(ipo); - fileno = trace_add_file(td, t->device); + fileno = trace_add_file(td, t->device, &bs); ios[DDIR_TRIM]++; - if (t->bytes > bs[DDIR_TRIM]) - bs[DDIR_TRIM] = t->bytes; + if (t->bytes > rw_bs[DDIR_TRIM]) + rw_bs[DDIR_TRIM] = t->bytes; td->o.size += t->bytes; memset(ipo, 0, sizeof(*ipo)); INIT_FLIST_HEAD(&ipo->list); - /* - * the 512 is wrong here, it should be the hardware sector size... - */ - ipo->offset = t->sector * 512; + ipo->offset = t->sector * bs; + if (td->o.replay_scale) + ipo->offset = ipo->offset / td->o.replay_scale; + ipo_bytes_align(td->o.replay_align, ipo); ipo->len = t->bytes; ipo->delay = ttime / 1000; ipo->ddir = DDIR_TRIM; @@ -259,21 +303,22 @@ static void handle_trace_discard(struct thread_data *td, static void handle_trace_fs(struct thread_data *td, struct blk_io_trace *t, unsigned long long ttime, unsigned long *ios, - unsigned int *bs) + unsigned int *rw_bs) { + unsigned int bs; int rw; int fileno; - fileno = trace_add_file(td, t->device); + fileno = trace_add_file(td, t->device, &bs); rw = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0; - if (t->bytes > bs[rw]) - bs[rw] = t->bytes; + if (t->bytes > rw_bs[rw]) + rw_bs[rw] = t->bytes; ios[rw]++; td->o.size += t->bytes; - store_ipo(td, t->sector, t->bytes, rw, ttime, fileno); + store_ipo(td, t->sector, t->bytes, rw, ttime, fileno, bs); } /* @@ -284,7 +329,7 @@ static void handle_trace(struct thread_data *td, struct blk_io_trace *t, unsigned long *ios, unsigned int *bs) { static unsigned long long last_ttime; - unsigned long long delay; + unsigned long long delay = 0; if ((t->action & 0xffff) != __BLK_TA_QUEUE) return; @@ -299,6 +344,8 @@ static void handle_trace(struct thread_data *td, struct blk_io_trace *t, } } + t_bytes_align(&td->o, t); + if (t->action & BLK_TC_ACT(BLK_TC_NOTIFY)) handle_trace_notify(t); else if (t->action & BLK_TC_ACT(BLK_TC_DISCARD))