X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=37a425e85ee6fde71ec7aa537b0f6947687cc128;hp=1997bb7cc8761e28ba9baf9f8d303530805d37ab;hb=e4dad9c614d7f6842b0efefbae3ca0fa540cad0a;hpb=f4705a73fda9a84a12a26bcd6bc2ab4f012ace71 diff --git a/fio.c b/fio.c index 1997bb7c..37a425e8 100644 --- a/fio.c +++ b/fio.c @@ -49,6 +49,7 @@ int nr_process = 0; int nr_thread = 0; int shm_id = 0; int temp_stall_ts; +unsigned long done_secs = 0; static struct fio_mutex *startup_mutex; static volatile int fio_abort; @@ -74,10 +75,12 @@ static void terminate_threads(int group_id) struct thread_data *td; int i; + dprint(FD_PROCESS, "terminate group_id=%d\n", group_id); + for_each_td(td, i) { if (group_id == TERMINATE_ALL || groupid == td->groupid) { - dprint(FD_PROCESS, "setting terminate on %d\n", - td->pid); + dprint(FD_PROCESS, "setting terminate on %s/%d\n", + td->o.name, td->pid); td->terminate = 1; td->o.start_delay = 0; @@ -98,6 +101,9 @@ static void terminate_threads(int group_id) static void sig_handler(int sig) { + if (!threads) + return; + switch (sig) { case SIGALRM: update_io_ticks(); @@ -409,10 +415,10 @@ sync_done: */ min_events = 0; if (queue_full(td) || ret == FIO_Q_BUSY) { - min_events = 1; - - if (td->cur_depth > td->o.iodepth_low) + if (td->cur_depth >= td->o.iodepth_low) min_events = td->cur_depth - td->o.iodepth_low; + if (!min_events) + min_events = 1; } /* @@ -542,16 +548,12 @@ sync_done: /* * See if we need to complete some commands */ - if (ret == FIO_Q_QUEUED || ret == FIO_Q_BUSY) { + if (queue_full(td) || ret == FIO_Q_BUSY) { min_evts = 0; - if (queue_full(td) || ret == FIO_Q_BUSY) { + if (td->cur_depth >= td->o.iodepth_low) + min_evts = td->cur_depth - td->o.iodepth_low; + if (!min_evts) min_evts = 1; - - if (td->cur_depth > td->o.iodepth_low) - min_evts = td->cur_depth - - td->o.iodepth_low; - } - fio_gettime(&comp_time, NULL); bytes_done = io_u_queued_complete(td, min_evts); if (bytes_done < 0) @@ -639,22 +641,6 @@ static void cleanup_io_u(struct thread_data *td) free_io_mem(td); } -/* - * "randomly" fill the buffer contents - */ -static void fill_io_buf(struct thread_data *td, struct io_u *io_u, int max_bs) -{ - long *ptr = io_u->buf; - - 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) { struct io_u *io_u; @@ -697,8 +683,8 @@ static int init_io_u(struct thread_data *td) if (!(td->io_ops->flags & FIO_NOIO)) { io_u->buf = p + max_bs * i; - if (td_write(td)) - fill_io_buf(td, io_u, max_bs); + if (td_write(td) && !td->o.refill_buffers) + io_u_fill_buffer(td, io_u, max_bs); } io_u->index = i; @@ -1111,10 +1097,13 @@ reaped: (*nr_running)--; (*m_rate) -= td->o.ratemin; (*t_rate) -= td->o.rate; - pending--; + if (!td->pid) + pending--; if (td->error) exit_value++; + + done_secs += mtime_since_now(&td->epoch) / 1000; } if (*nr_running == cputhreads && !pending && realthreads) @@ -1222,8 +1211,11 @@ static void run_threads(void) continue; } - if (td->o.stonewall && (nr_started || nr_running)) + if (td->o.stonewall && (nr_started || nr_running)) { + dprint(FD_PROCESS, "%s: stonewall wait\n", + td->o.name); break; + } /* * Set state to created. Thread will transition @@ -1244,12 +1236,15 @@ static void run_threads(void) if (pthread_detach(td->thread) < 0) perror("pthread_detach"); } else { + pid_t pid; dprint(FD_PROCESS, "will fork\n"); - if (!fork()) { + pid = fork(); + if (!pid) { int ret = fork_main(shm_id, i); - exit(ret); - } + _exit(ret); + } else if (i == fio_debug_jobno) + *fio_debug_jobp = pid; } fio_mutex_down(startup_mutex); }