blktrace support: adjust largest io_u buffer size to match trace
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/blktrace.c b/blktrace.c
index 5793773..afa699c 100644
--- a/blktrace.c
+++ b/blktrace.c
@@ -83,7 +83,8 @@
* due to internal workings of the block layer.
*/
static void handle_trace(struct thread_data *td, struct blk_io_trace *t,
- unsigned long long ttime, unsigned long *ios)
+ unsigned long long ttime, unsigned long *ios,
+ unsigned int *bs)
{
int rw;
@@ -99,6 +100,10 @@
return;
rw = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0;
+
+ if (t->bytes > bs[rw])
+ bs[rw] = t->bytes;
+
ios[rw]++;
td->o.size += t->bytes;
store_ipo(td, t->sector, t->bytes, rw, ttime);
@@ -114,6 +119,7 @@
struct blk_io_trace t;
unsigned long ios[2];
unsigned int cpu;
+ unsigned int rw_bs[2];
int fd;
fd = open(filename, O_RDONLY);
@@ -124,9 +130,10 @@
td->o.size = 0;
- ios[0] = ios[1] = 0;
- ttime = 0;
cpu = 0;
+ ttime = 0;
+ ios[0] = ios[1] = 0;
+ rw_bs[0] = rw_bs[1] = 0;
do {
/*
* Once this is working fully, I'll add a layer between
@@ -166,7 +173,7 @@
delay = 0;
if (cpu == t.cpu)
delay = t.time - ttime;
- handle_trace(td, &t, delay, ios);
+ handle_trace(td, &t, delay, ios, rw_bs);
ttime = t.time;
cpu = t.cpu;
} while (1);
@@ -176,12 +183,17 @@
if (!ios[DDIR_READ] && !ios[DDIR_WRITE]) {
log_err("fio: found no ios in blktrace data\n");
return 1;
- } else if (ios[DDIR_READ] && !ios[DDIR_READ])
+ } else if (ios[DDIR_READ] && !ios[DDIR_READ]) {
td->o.td_ddir = TD_DDIR_READ;
- else if (!ios[DDIR_READ] && ios[DDIR_WRITE])
+ td->o.max_bs[DDIR_READ] = rw_bs[DDIR_READ];
+ } else if (!ios[DDIR_READ] && ios[DDIR_WRITE]) {
td->o.td_ddir = TD_DDIR_WRITE;
- else
+ td->o.max_bs[DDIR_WRITE] = rw_bs[DDIR_WRITE];
+ } else {
td->o.td_ddir = TD_DDIR_RW;
+ td->o.max_bs[DDIR_READ] = rw_bs[DDIR_READ];
+ td->o.max_bs[DDIR_WRITE] = rw_bs[DDIR_WRITE];
+ }
/*
* We need to do direct/raw ios to the device, to avoid getting