X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=iolog.c;h=cac1aba21e8bb5b2b53a4e957ebebfd0a13eaf1a;hp=1eb89b29171c2796ce0df8743cdb40b866a1b5e6;hb=370c2c87bcb4dbcff279fe7235752ed97a04dcab;hpb=12d02717a293cdd0c85504c958f7bf57411bb30b diff --git a/iolog.c b/iolog.c index 1eb89b29..cac1aba2 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) @@ -260,6 +268,33 @@ restart: 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);