* 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;
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);
struct blk_io_trace t;
unsigned long ios[2];
unsigned int cpu;
+ unsigned int rw_bs[2];
int fd;
fd = open(filename, O_RDONLY);
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
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);
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
*/
fio_sem_remove(td->mutex);
+ /*
+ * May alter parameters that init_io_u() will use, so we need to
+ * do this first.
+ */
+ if (init_iolog(td))
+ goto err;
+
if (init_io_u(td))
goto err;
goto err;
}
- if (init_iolog(td))
- goto err;
-
if (td->ioprio) {
if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) {
td_verror(td, errno, "ioprio_set");