fprintf(td->iolog_f, "%u,%llu,%lu\n", io_u->ddir, io_u->offset, io_u->buflen);
}
+static void iolog_delay(struct thread_data *td, unsigned long delay)
+{
+ unsigned long usec = utime_since_now(&td->last_issue);
+
+ if (delay < usec)
+ return;
+
+ delay -= usec;
+
+ /*
+ * less than 100 usec delay, just regard it as noise
+ */
+ if (delay < 100)
+ return;
+
+ usec_sleep(td, delay);
+}
+
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
{
struct io_piece *ipo;
io_u->buflen = ipo->len;
io_u->ddir = ipo->ddir;
io_u->file = ipo->file;
+
+ if (ipo->delay)
+ iolog_delay(td, ipo->delay);
+
/*
* work around, this needs a format change to work for > 1 file
*/
}
ipo = malloc(sizeof(*ipo));
+ memset(ipo, 0, sizeof(*ipo));
INIT_LIST_HEAD(&ipo->list);
ipo->offset = offset;
ipo->len = bytes;
else if (reads && !writes)
td->o.td_ddir = TD_DDIR_READ;
else if (!reads && writes)
- td->o.td_ddir = TD_DDIR_READ;
+ td->o.td_ddir = TD_DDIR_WRITE;
else
td->o.td_ddir = TD_DDIR_RW;
{
FILE *f;
+ if (td->o.nr_files > 1) {
+ log_err("fio: write_iolog only works with 1 file currently\n");
+ return 1;
+ }
+
f = fopen(td->o.write_iolog_file, "w+");
if (!f) {
perror("fopen write iolog");
if (td->io_ops->flags & FIO_DISKLESSIO)
return 0;
- if (td->o.read_iolog_file)
- ret = init_iolog_read(td);
- else if (td->o.write_iolog_file)
+ if (td->o.read_iolog_file) {
+ /*
+ * Check if it's a blktrace file and load that if possible.
+ * Otherwise assume it's a normal log file and load that.
+ */
+ if (is_blktrace(td->o.read_iolog_file))
+ ret = load_blktrace(td, td->o.read_iolog_file);
+ else
+ ret = init_iolog_read(td);
+ } else if (td->o.write_iolog_file)
ret = init_iolog_write(td);
return ret;