X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=77e5572ba02aa1bf8129f80f3825d8cf962b229b;hp=b242f9445cb872c14c0ec008cba1f257dd4f53f1;hb=d98cd22835c6764287f9a8d3dd3f9447bdf062d1;hpb=fddc6604f91ebf76d9090741f9d4f5a4d33be0c6 diff --git a/fio.c b/fio.c index b242f944..77e5572b 100644 --- a/fio.c +++ b/fio.c @@ -55,13 +55,20 @@ unsigned long page_size; (char *) (((unsigned long) (buf) + page_mask) & ~page_mask) int groupid = 0; -int thread_number = 0; -int nr_process = 0; -int nr_thread = 0; +unsigned int thread_number = 0; +unsigned int nr_process = 0; +unsigned int nr_thread = 0; int shm_id = 0; int temp_stall_ts; unsigned long done_secs = 0; +/* + * Just expose an empty list, if the OS does not support disk util stats + */ +#ifndef FIO_HAVE_DISK_UTIL +FLIST_HEAD(disk_list); +#endif + static struct fio_mutex *startup_mutex; static struct fio_mutex *writeout_mutex; static volatile int fio_abort; @@ -445,21 +452,22 @@ static inline void update_tv_cache(struct thread_data *td) __update_tv_cache(td); } -static int break_on_this_error(struct thread_data *td, int *retptr) +static int break_on_this_error(struct thread_data *td, enum fio_ddir ddir, + int *retptr) { int ret = *retptr; if (ret < 0 || td->error) { int err; - if (!td->o.continue_on_error) - return 1; - if (ret < 0) err = -ret; else err = td->error; + if (!(td->o.continue_on_error & td_error_type(ddir, err))) + return 1; + if (td_non_fatal_error(err)) { /* * Continue with the I/Os in case of @@ -605,7 +613,7 @@ sync_done: break; } - if (break_on_this_error(td, &ret)) + if (break_on_this_error(td, io_u->ddir, &ret)) break; /* @@ -671,6 +679,7 @@ static void do_io(struct thread_data *td) int min_evts = 0; struct io_u *io_u; int ret2, full; + enum fio_ddir ddir; if (td->terminate) break; @@ -689,6 +698,8 @@ static void do_io(struct thread_data *td) if (!io_u) break; + ddir = io_u->ddir; + /* * Add verification end_io handler, if asked to verify * a previously written file. @@ -767,7 +778,7 @@ sync_done: break; } - if (break_on_this_error(td, &ret)) + if (break_on_this_error(td, ddir, &ret)) break; /* @@ -826,7 +837,7 @@ sync_done: } if (td->trim_entries) - printf("trim entries %ld\n", td->trim_entries); + log_err("fio: %d trim entries leaked?\n", td->trim_entries); if (td->o.fill_device && td->error == ENOSPC) { td->error = 0; @@ -929,7 +940,7 @@ static int init_io_u(struct thread_data *td) dprint(FD_MEM, "io_u alloc %p, index %u\n", io_u, i); if (!(td->io_ops->flags & FIO_NOIO)) { - io_u->buf = p + max_bs * i; + io_u->buf = p; dprint(FD_MEM, "io_u %p, mem %p\n", io_u, io_u->buf); if (td_write(td)) @@ -946,6 +957,7 @@ static int init_io_u(struct thread_data *td) io_u->index = i; io_u->flags = IO_U_F_FREE; flist_add(&io_u->list, &td->io_u_freelist); + p += max_bs; } return 0; @@ -1236,9 +1248,12 @@ static void *thread_main(void *data) memcpy(&td->iops_sample_time, &td->start, sizeof(td->start)); memcpy(&td->tv_cache, &td->start, sizeof(td->start)); - if (td->o.ratemin[0] || td->o.ratemin[1]) - memcpy(&td->lastrate, &td->bw_sample_time, - sizeof(td->lastrate)); + if (td->o.ratemin[0] || td->o.ratemin[1]) { + memcpy(&td->lastrate[0], &td->bw_sample_time, + sizeof(td->bw_sample_time)); + memcpy(&td->lastrate[1], &td->bw_sample_time, + sizeof(td->bw_sample_time)); + } if (clear_state) clear_io_state(td); @@ -1354,7 +1369,6 @@ err: if (td->o.write_iolog_file) write_iolog_close(td); - options_mem_free(td); td_set_runstate(td, TD_EXITED); return (void *) (unsigned long) td->error; } @@ -1392,10 +1406,12 @@ static int fork_main(int shmid, int offset) /* * Run over the job map and reap the threads that have exited, if any. */ -static void reap_threads(int *nr_running, int *t_rate, int *m_rate) +static void reap_threads(unsigned int *nr_running, unsigned int *t_rate, + unsigned int *m_rate) { struct thread_data *td; - int i, cputhreads, realthreads, pending, status, ret; + unsigned int cputhreads, realthreads, pending; + int i, status, ret; /* * reap exited threads (TD_EXITED -> TD_REAPED) @@ -1535,7 +1551,7 @@ static void run_threads(void) { struct thread_data *td; unsigned long spent; - int i, todo, nr_running, m_rate, t_rate, nr_started; + unsigned int i, todo, nr_running, m_rate, t_rate, nr_started; if (fio_pin_memory()) return; @@ -1552,7 +1568,7 @@ static void run_threads(void) nr_thread > 1 ? "s" : ""); if (nr_process) { if (nr_thread) - printf(" and "); + log_info(" and "); log_info("%d process%s", nr_process, nr_process > 1 ? "es" : ""); } @@ -1766,17 +1782,23 @@ static void run_threads(void) int exec_run(void) { + struct thread_data *td; + int i; + if (nr_clients) return fio_handle_clients(); - if (exec_profile && load_profile(exec_profile)) - return 1; - + if (exec_profile) { + if (load_profile(exec_profile)) + return 1; + free(exec_profile); + exec_profile = NULL; + } if (!thread_number) return 0; if (write_bw_log) { - setup_log(&agg_io_log[DDIR_READ]); - setup_log(&agg_io_log[DDIR_WRITE]); + setup_log(&agg_io_log[DDIR_READ], 0); + setup_log(&agg_io_log[DDIR_WRITE], 0); } startup_mutex = fio_mutex_init(0); @@ -1803,6 +1825,9 @@ int exec_run(void) } } + for_each_td(td, i) + fio_options_free(td); + cgroup_kill(cgroup_list); sfree(cgroup_list); sfree(cgroup_mnt);