static void iolog_delay(struct thread_data *td, unsigned long delay)
{
unsigned long usec = utime_since_now(&td->last_issue);
+ unsigned long this_delay;
if (delay < usec)
return;
if (delay < 100)
return;
- usec_sleep(td, delay);
+ while (delay && !td->terminate) {
+ this_delay = delay;
+ if (this_delay > 500000)
+ this_delay = 500000;
+
+ usec_sleep(td, this_delay);
+ delay -= this_delay;
+ }
}
static int ipo_special(struct thread_data *td, struct io_piece *ipo)
td->io_hist_len++;
}
+void unlog_io_piece(struct thread_data *td, struct io_u *io_u)
+{
+ struct io_piece *ipo = io_u->ipo;
+
+ if (!ipo)
+ return;
+
+ if (ipo->flags & IP_F_ONRB)
+ rb_erase(&ipo->rb_node, &td->io_hist_tree);
+ else if (ipo->flags & IP_F_ONLIST)
+ flist_del(&ipo->list);
+
+ free(ipo);
+ io_u->ipo = NULL;
+ td->io_hist_len--;
+}
+
+void trim_io_piece(struct thread_data *td, struct io_u *io_u)
+{
+ struct io_piece *ipo = io_u->ipo;
+
+ if (!ipo)
+ return;
+
+ ipo->len = io_u->xfer_buflen - io_u->resid;
+}
+
void write_iolog_close(struct thread_data *td)
{
fflush(td->iolog_f);
} else {
ipo->offset = offset;
ipo->len = bytes;
- if (bytes > td->o.max_bs[rw])
+ if (rw != DDIR_INVAL && bytes > td->o.max_bs[rw])
td->o.max_bs[rw] = bytes;
ipo->fileno = fileno;
ipo->file_action = file_action;
+ td->o.size += bytes;
}
queue_io_piece(td, ipo);
return ret;
}
-void setup_log(struct io_log **log, unsigned long avg_msec, int log_type)
+void setup_log(struct io_log **log, unsigned long avg_msec, int log_type,
+ int log_offset)
{
struct io_log *l = malloc(sizeof(*l));
l->nr_samples = 0;
l->max_samples = 1024;
l->log_type = log_type;
- l->log = malloc(l->max_samples * sizeof(struct io_sample));
+ l->log_offset = log_offset;
+ l->log = malloc(l->max_samples * log_entry_sz(l));
l->avg_msec = avg_msec;
*log = l;
}
+#ifdef CONFIG_SETVBUF
+static void *set_file_buffer(FILE *f)
+{
+ size_t size = 1048576;
+ void *buf;
+
+ buf = malloc(size);
+ setvbuf(f, buf, _IOFBF, size);
+ return buf;
+}
+
+static void clear_file_buffer(void *buf)
+{
+ free(buf);
+}
+#else
+static void *set_file_buffer(FILE *f)
+{
+ return NULL;
+}
+
+static void clear_file_buffer(void *buf)
+{
+}
+#endif
+
void __finish_log(struct io_log *log, const char *name)
{
- unsigned int i;
+ uint64_t i;
+ void *buf;
FILE *f;
f = fopen(name, "a");
return;
}
+ buf = set_file_buffer(f);
+
for (i = 0; i < log->nr_samples; i++) {
- fprintf(f, "%lu, %lu, %u, %u\n",
- (unsigned long) log->log[i].time,
- (unsigned long) log->log[i].val,
- log->log[i].ddir, log->log[i].bs);
+ struct io_sample *s = get_sample(log, i);
+
+ if (!log->log_offset) {
+ fprintf(f, "%lu, %lu, %u, %u\n",
+ (unsigned long) s->time,
+ (unsigned long) s->val,
+ s->ddir, s->bs);
+ } else {
+ struct io_sample_offset *so = (void *) s;
+
+ fprintf(f, "%lu, %lu, %u, %u, %llu\n",
+ (unsigned long) s->time,
+ (unsigned long) s->val,
+ s->ddir, s->bs,
+ (unsigned long long) so->offset);
+ }
}
fclose(f);
+ clear_file_buffer(buf);
free(log->log);
free(log);
}
CLAT_LOG_MASK = 8,
IOPS_LOG_MASK = 16,
- ALL_LOG_MASK = 31,
ALL_LOG_NR = 5,
};
void fio_writeout_logs(struct thread_data *td)
{
- unsigned int log_mask = ALL_LOG_MASK;
+ unsigned int log_mask = 0;
unsigned int log_left = ALL_LOG_NR;
int old_state, i;
struct log_type *lt = &log_types[i];
int ret;
- if (log_mask & lt->mask) {
+ if (!(log_mask & lt->mask)) {
ret = lt->fn(td, log_left != 1);
if (!ret) {
log_left--;
- log_mask &= ~lt->mask;
+ log_mask |= lt->mask;
}
}
}