X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=fio.c;h=6483e64c9462eeae4075fa6f449dae7970bb1eeb;hb=375b2695693f56987e23deef3ded8e5b06ef6797;hp=6f4fddae8f0cbcbdc28cc96dcbd7e722b3b07997;hpb=cf4464ca60ce75ac241c621bc70a2500beeb782f;p=fio.git diff --git a/fio.c b/fio.c index 6f4fddae..6483e64c 100644 --- a/fio.c +++ b/fio.c @@ -70,7 +70,10 @@ static void terminate_threads(int group_id) for_each_td(td, i) { if (group_id == TERMINATE_ALL || groupid == td->groupid) { - if (td->runstate <= TD_RUNNING) + /* + * if the thread is running, just let it exit + */ + if (td->runstate < TD_RUNNING) kill(td->pid, SIGQUIT); td->terminate = 1; td->o.start_delay = 0; @@ -308,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; } @@ -438,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; } @@ -640,6 +645,8 @@ 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); @@ -751,7 +758,6 @@ static void *thread_main(void *data) unsigned long long runtime[2]; struct thread_data *td = data; unsigned long elapsed; - struct timeval t; int clear_state; if (!td->o.use_thread) @@ -766,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; @@ -861,10 +871,6 @@ static void *thread_main(void *data) if (td->error || td->terminate) break; - fio_gettime(&t, NULL); - if (runtime_exceeded(td, &t)) - break; - if (td->o.verify == VERIFY_NONE) continue; @@ -913,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; } /*