X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=iolog.c;h=f49895929c34fcc3313a9ce6b6500d1e3277c9b6;hp=deec0861a9c49b4d4df0700c1aeb8288bda4df8e;hb=9e060c6a490b3394b43c0479d5be6ee335b13117;hpb=ea5409f9347303aeb8478544662184ac4af49d20 diff --git a/iolog.c b/iolog.c index deec0861..f4989592 100644 --- a/iolog.c +++ b/iolog.c @@ -58,6 +58,7 @@ void log_file(struct thread_data *td, struct fio_file *f, 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; @@ -70,7 +71,14 @@ static void iolog_delay(struct thread_data *td, unsigned long delay) 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) @@ -371,7 +379,7 @@ static int read_iolog2(struct thread_data *td, FILE *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; @@ -516,9 +524,36 @@ void setup_log(struct io_log **log, unsigned long avg_msec, int log_type) *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; + void *buf; FILE *f; f = fopen(name, "a"); @@ -527,6 +562,8 @@ void __finish_log(struct io_log *log, const char *name) 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, @@ -535,6 +572,7 @@ void __finish_log(struct io_log *log, const char *name) } fclose(f); + clear_file_buffer(buf); free(log->log); free(log); }