X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=6483e64c9462eeae4075fa6f449dae7970bb1eeb;hp=160d533583b6850c30bacbd98e1ef345db5c7680;hb=375b2695693f56987e23deef3ded8e5b06ef6797;hpb=cbf5c1d7a2286fa1cf548c0678b3b0bf13bcda7e diff --git a/fio.c b/fio.c index 160d5335..6483e64c 100644 --- a/fio.c +++ b/fio.c @@ -35,6 +35,7 @@ #include #include "fio.h" +#include "hash.h" unsigned long page_mask; unsigned long page_size; @@ -310,6 +311,7 @@ static void do_verify(struct thread_data *td) if (runtime_exceeded(td, &io_u->start_time)) { put_io_u(td, io_u); + td->terminate = 1; break; } @@ -332,6 +334,7 @@ static void do_verify(struct thread_data *td) ret = -io_u->error; else if (io_u->resid) { int bytes = io_u->xfer_buflen - io_u->resid; + struct fio_file *f = io_u->file; /* * zero read, fail @@ -345,8 +348,11 @@ static void do_verify(struct thread_data *td) io_u->xfer_buflen = io_u->resid; io_u->xfer_buf += bytes; io_u->offset += bytes; + f->last_completed_pos = io_u->offset; + + td->ts.short_io_u[io_u->ddir]++; - if (io_u->offset == io_u->file->real_file_size) + if (io_u->offset == f->real_file_size) goto sync_done; requeue_io_u(td, &io_u); @@ -436,6 +442,7 @@ static void do_io(struct thread_data *td) if (runtime_exceeded(td, &s)) { put_io_u(td, io_u); + td->terminate = 1; break; } @@ -446,6 +453,7 @@ static void do_io(struct thread_data *td) ret = -io_u->error; else if (io_u->resid) { int bytes = io_u->xfer_buflen - io_u->resid; + struct fio_file *f = io_u->file; /* * zero read, fail @@ -459,8 +467,11 @@ static void do_io(struct thread_data *td) io_u->xfer_buflen = io_u->resid; io_u->xfer_buf += bytes; io_u->offset += bytes; + f->last_completed_pos = io_u->offset; - if (io_u->offset == io_u->file->real_file_size) + td->ts.short_io_u[io_u->ddir]++; + + if (io_u->offset == f->real_file_size) goto sync_done; requeue_io_u(td, &io_u); @@ -588,14 +599,17 @@ static void cleanup_io_u(struct thread_data *td) /* * "randomly" fill the buffer contents */ -static void fill_rand_buf(struct io_u *io_u, int max_bs) +static void fill_io_buf(struct thread_data *td, struct io_u *io_u, int max_bs) { - int *ptr = io_u->buf; + long *ptr = io_u->buf; - while ((void *) ptr - io_u->buf < max_bs) { - *ptr = rand() * 0x9e370001; - ptr++; - } + if (!td->o.zero_buffers) { + while ((void *) ptr - io_u->buf < max_bs) { + *ptr = rand() * GOLDEN_RATIO_PRIME; + ptr++; + } + } else + memset(ptr, 0, max_bs); } static int init_io_u(struct thread_data *td) @@ -631,13 +645,16 @@ static int init_io_u(struct thread_data *td) p = ALIGN(td->orig_buffer); for (i = 0; i < max_units; i++) { + if (td->terminate) + return 1; io_u = malloc(sizeof(*io_u)); memset(io_u, 0, sizeof(*io_u)); INIT_LIST_HEAD(&io_u->list); io_u->buf = p + max_bs * i; - if (td_write(td) || td_rw(td)) - fill_rand_buf(io_u, max_bs); + + if (td_write(td)) + fill_io_buf(td, io_u, max_bs); io_u->index = i; io_u->flags = IO_U_F_FREE; @@ -755,41 +772,45 @@ static void *thread_main(void *data) INIT_LIST_HEAD(&td->io_hist_list); td->io_hist_tree = RB_ROOT; + td_set_runstate(td, TD_INITIALIZED); + fio_sem_up(startup_sem); + fio_sem_down(td->mutex); + + /* + * the ->mutex semaphore is now no longer used, close it to avoid + * eating a file descriptor + */ + fio_sem_remove(td->mutex); + + /* + * May alter parameters that init_io_u() will use, so we need to + * do this first. + */ + if (init_iolog(td)) + goto err; + if (init_io_u(td)) - goto err_sem; + goto err; - if (fio_setaffinity(td) == -1) { + if (td->o.cpumask_set && fio_setaffinity(td) == -1) { td_verror(td, errno, "cpu_set_affinity"); - goto err_sem; + goto err; } - if (init_iolog(td)) - goto err_sem; - if (td->ioprio) { if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) { td_verror(td, errno, "ioprio_set"); - goto err_sem; + goto err; } } if (nice(td->o.nice) == -1) { td_verror(td, errno, "nice"); - goto err_sem; + goto err; } if (td->o.ioscheduler && switch_ioscheduler(td)) - goto err_sem; - - td_set_runstate(td, TD_INITIALIZED); - fio_sem_up(startup_sem); - fio_sem_down(td->mutex); - - /* - * the ->mutex semaphore is now no longer used, close it to avoid - * eating a file descriptor - */ - fio_sem_remove(td->mutex); + goto err; if (!td->o.create_serialize && setup_files(td)) goto err; @@ -814,7 +835,7 @@ static void *thread_main(void *data) runtime[0] = runtime[1] = 0; clear_state = 0; - while (td->o.loops--) { + while (td->o.time_based || td->o.loops--) { fio_gettime(&td->start, NULL); memcpy(&td->ts.stat_sample_time, &td->start, sizeof(td->start)); @@ -898,9 +919,6 @@ err: options_mem_free(td); td_set_runstate(td, TD_EXITED); return (void *) (unsigned long) td->error; -err_sem: - fio_sem_up(startup_sem); - goto err; } /*