X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=backend.c;h=38efc2307809266d234cfeb183e33bda94b5ea68;hp=e65af5258af564e64594c65bcbe32f01bb6d9f35;hb=fb390e242cac8868e01cdc2046c63e04e3d53d70;hpb=122c772599f1b0a3148a5790775698d3fa92cc10 diff --git a/backend.c b/backend.c index e65af525..38efc230 100644 --- a/backend.c +++ b/backend.c @@ -56,13 +56,13 @@ static struct flist_head *cgroup_list; static char *cgroup_mnt; static int exit_value; static volatile int fio_abort; +static unsigned int nr_process = 0; +static unsigned int nr_thread = 0; struct io_log *agg_io_log[2]; int groupid = 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; @@ -87,6 +87,11 @@ static void sig_int(int sig) } } +static void sig_show_status(int sig) +{ + show_running_run_stats(); +} + static void set_sig_handlers(void) { struct sigaction act; @@ -101,6 +106,11 @@ static void set_sig_handlers(void) act.sa_flags = SA_RESTART; sigaction(SIGTERM, &act, NULL); + memset(&act, 0, sizeof(act)); + act.sa_handler = sig_show_status; + act.sa_flags = SA_RESTART; + sigaction(SIGUSR1, &act, NULL); + if (is_backend) { memset(&act, 0, sizeof(act)); act.sa_handler = sig_int; @@ -335,8 +345,8 @@ static int break_on_this_error(struct thread_data *td, enum fio_ddir ddir, return 1; if (td_non_fatal_error(err)) { - /* - * Continue with the I/Os in case of + /* + * Continue with the I/Os in case of * a non fatal error. */ update_error_count(td, err); @@ -958,10 +968,12 @@ static void *thread_main(void *data) { unsigned long long elapsed; struct thread_data *td = data; + struct thread_options *o = &td->o; pthread_condattr_t attr; int clear_state; + int ret; - if (!td->o.use_thread) { + if (!o->use_thread) { setsid(); td->pid = getpid(); } else @@ -998,16 +1010,17 @@ static void *thread_main(void *data) * eating a file descriptor */ fio_mutex_remove(td->mutex); + td->mutex = NULL; /* * A new gid requires privilege, so we need to do this before setting * the uid. */ - if (td->o.gid != -1U && setgid(td->o.gid)) { + if (o->gid != -1U && setgid(o->gid)) { td_verror(td, errno, "setgid"); goto err; } - if (td->o.uid != -1U && setuid(td->o.uid)) { + if (o->uid != -1U && setuid(o->uid)) { td_verror(td, errno, "setuid"); goto err; } @@ -1016,18 +1029,24 @@ static void *thread_main(void *data) * If we have a gettimeofday() thread, make sure we exclude that * thread from this job */ - if (td->o.gtod_cpu) - fio_cpu_clear(&td->o.cpumask, td->o.gtod_cpu); + if (o->gtod_cpu) + fio_cpu_clear(&o->cpumask, o->gtod_cpu); /* * Set affinity first, in case it has an impact on the memory * allocations. */ - if (td->o.cpumask_set && fio_setaffinity(td->pid, td->o.cpumask) == -1) { - td_verror(td, errno, "cpu_set_affinity"); - goto err; + if (o->cpumask_set) { + ret = fio_setaffinity(td->pid, o->cpumask); + if (ret == -1) { + td_verror(td, errno, "cpu_set_affinity"); + goto err; + } } + if (fio_pin_memory(td)) + goto err; + /* * May alter parameters that init_io_u() will use, so we need to * do this first. @@ -1038,29 +1057,30 @@ static void *thread_main(void *data) if (init_io_u(td)) goto err; - if (td->o.verify_async && verify_async_init(td)) + if (o->verify_async && verify_async_init(td)) goto err; - if (td->ioprio_set) { - if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) { + if (o->ioprio) { + ret = ioprio_set(IOPRIO_WHO_PROCESS, 0, o->ioprio_class, o->ioprio); + if (ret == -1) { td_verror(td, errno, "ioprio_set"); goto err; } } - if (td->o.cgroup_weight && cgroup_setup(td, cgroup_list, &cgroup_mnt)) + if (td->o.cgroup && cgroup_setup(td, cgroup_list, &cgroup_mnt)) goto err; errno = 0; - if (nice(td->o.nice) == -1 && errno != 0) { + if (nice(o->nice) == -1 && errno != 0) { td_verror(td, errno, "nice"); goto err; } - if (td->o.ioscheduler && switch_ioscheduler(td)) + if (o->ioscheduler && switch_ioscheduler(td)) goto err; - if (!td->o.create_serialize && setup_files(td)) + if (!o->create_serialize && setup_files(td)) goto err; if (td_io_init(td)) @@ -1069,16 +1089,16 @@ static void *thread_main(void *data) if (init_random_map(td)) goto err; - if (td->o.exec_prerun) { - if (exec_string(td->o.exec_prerun)) - goto err; - } + if (o->exec_prerun && exec_string(o->exec_prerun)) + goto err; - if (td->o.pre_read) { + if (o->pre_read) { if (pre_read_files(td) < 0) goto err; } + fio_verify_init(td); + fio_gettime(&td->epoch, NULL); getrusage(RUSAGE_SELF, &td->ru_start); @@ -1090,9 +1110,9 @@ static void *thread_main(void *data) memcpy(&td->tv_cache, &td->start, sizeof(td->start)); if (td->o.ratemin[0] || td->o.ratemin[1]) { - memcpy(&td->lastrate[0], &td->bw_sample_time, + memcpy(&td->lastrate[0], &td->bw_sample_time, sizeof(td->bw_sample_time)); - memcpy(&td->lastrate[1], &td->bw_sample_time, + memcpy(&td->lastrate[1], &td->bw_sample_time, sizeof(td->bw_sample_time)); } @@ -1141,6 +1161,8 @@ static void *thread_main(void *data) td->ts.io_bytes[0] = td->io_bytes[0]; td->ts.io_bytes[1] = td->io_bytes[1]; + fio_unpin_memory(td); + fio_mutex_down(writeout_mutex); if (td->bw_log) { if (td->o.bw_log_file) { @@ -1198,8 +1220,8 @@ err: cleanup_io_u(td); cgroup_shutdown(td, &cgroup_mnt); - if (td->o.cpumask_set) { - int ret = fio_cpuset_exit(&td->o.cpumask); + if (o->cpumask_set) { + int ret = fio_cpuset_exit(&o->cpumask); td_verror(td, ret, "fio_cpuset_exit"); } @@ -1297,6 +1319,7 @@ static void reap_threads(unsigned int *nr_running, unsigned int *t_rate, if (errno == ECHILD) { log_err("fio: pid=%d disappeared %d\n", (int) td->pid, td->runstate); + td->sig = ECHILD; td_set_runstate(td, TD_REAPED); goto reaped; } @@ -1308,6 +1331,7 @@ static void reap_threads(unsigned int *nr_running, unsigned int *t_rate, if (sig != SIGTERM) log_err("fio: pid=%d, got signal=%d\n", (int) td->pid, sig); + td->sig = sig; td_set_runstate(td, TD_REAPED); goto reaped; } @@ -1351,14 +1375,19 @@ static void run_threads(void) unsigned long spent; unsigned int i, todo, nr_running, m_rate, t_rate, nr_started; - if (fio_pin_memory()) - return; - if (fio_gtod_offload && fio_start_gtod_thread()) return; set_sig_handlers(); + nr_thread = nr_process = 0; + for_each_td(td, i) { + if (td->o.use_thread) + nr_thread++; + else + nr_process++; + } + if (!terse_output) { log_info("Starting "); if (nr_thread) @@ -1568,7 +1597,6 @@ static void run_threads(void) } update_io_ticks(); - fio_unpin_memory(); } static void *disk_thread_main(void *data) @@ -1656,6 +1684,7 @@ int fio_backend(void) for_each_td(td, i) fio_options_free(td); + free_disk_util(); cgroup_kill(cgroup_list); sfree(cgroup_list); sfree(cgroup_mnt);