void write_iolog_put(struct thread_data *td, struct io_u *io_u)
{
- fprintf(td->iolog_f, "%d,%llu,%u\n", io_u->ddir, io_u->offset, io_u->buflen);
+ fprintf(td->iolog_f, "%u,%llu,%u\n", io_u->ddir, io_u->offset, io_u->buflen);
}
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
free(td->iolog_buf);
}
-int init_iolog(struct thread_data *td)
+/*
+ * Open a stored log and read in the entries.
+ */
+static int init_iolog_read(struct thread_data *td)
{
unsigned long long offset;
unsigned int bytes;
char *str, *p;
FILE *f;
- int rw, i, reads, writes;
-
- if (!td->read_iolog && !td->write_iolog)
- return 0;
-
- if (td->read_iolog)
- f = fopen(td->iolog_file, "r");
- else
- f = fopen(td->iolog_file, "w");
+ int rw, reads, writes;
+ f = fopen(td->read_iolog_file, "r");
if (!f) {
- perror("fopen iolog");
- printf("file %s, %d/%d\n", td->iolog_file, td->read_iolog, td->write_iolog);
+ perror("fopen read iolog");
return 1;
}
- /*
- * That's it for writing, setup a log buffer and we're done.
- */
- if (td->write_iolog) {
- td->iolog_f = f;
- td->iolog_buf = malloc(8192);
- setvbuf(f, td->iolog_buf, _IOFBF, 8192);
- return 0;
- }
-
/*
* Read in the read iolog and store it, reuse the infrastructure
* for doing verifications.
*/
str = malloc(4096);
- reads = writes = i = 0;
+ reads = writes = 0;
while ((p = fgets(str, 4096, f)) != NULL) {
struct io_piece *ipo;
INIT_LIST_HEAD(&ipo->list);
ipo->offset = offset;
ipo->len = bytes;
- if (bytes > td->max_bs)
- td->max_bs = bytes;
- ipo->ddir = rw;
+ ipo->ddir = (enum fio_ddir) rw;
+ if (bytes > td->max_bs[rw])
+ td->max_bs[rw] = bytes;
list_add_tail(&ipo->list, &td->io_log_list);
- i++;
}
free(str);
fclose(f);
- if (!i)
+ if (!reads && !writes)
return 1;
-
- if (reads && !writes)
+ else if (reads && !writes)
td->ddir = DDIR_READ;
else if (!reads && writes)
td->ddir = DDIR_READ;
return 0;
}
+/*
+ * Setup a log for storing io patterns.
+ */
+static int init_iolog_write(struct thread_data *td)
+{
+ FILE *f;
+
+ f = fopen(td->write_iolog_file, "w+");
+ if (!f) {
+ perror("fopen write iolog");
+ return 1;
+ }
+
+ /*
+ * That's it for writing, setup a log buffer and we're done.
+ */
+ td->iolog_f = f;
+ td->iolog_buf = malloc(8192);
+ setvbuf(f, td->iolog_buf, _IOFBF, 8192);
+ return 0;
+}
+
+int init_iolog(struct thread_data *td)
+{
+ int ret = 0;
+
+ if (td->io_ops->flags & FIO_CPUIO)
+ return 0;
+
+ if (td->read_iolog_file)
+ ret = init_iolog_read(td);
+ else if (td->write_iolog_file)
+ ret = init_iolog_write(td);
+
+ return ret;
+}
+
int setup_rate(struct thread_data *td)
{
int nr_reads_per_sec;
return -1;
}
- nr_reads_per_sec = (td->rate * 1024) / td->min_bs;
+ nr_reads_per_sec = (td->rate * 1024) / td->min_bs[DDIR_READ];
td->rate_usec_cycle = 1000000 / nr_reads_per_sec;
td->rate_pending_usleep = 0;
return 0;