X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=backend.c;h=dcc6fba06fdb58636555cdd1db13d5113cab9b21;hp=319bd253342e164405d04cc5d1506a1e6f29337e;hb=80666bece308842c36132245e4cbbe9eb0bc506b;hpb=3c3ed070502bbfec387ded2c43d5e4559ca24a63 diff --git a/backend.c b/backend.c index 319bd253..dcc6fba0 100644 --- a/backend.c +++ b/backend.c @@ -50,6 +50,7 @@ #include "server.h" static pthread_t disk_util_thread; +static struct fio_mutex *disk_thread_mutex; static struct fio_mutex *startup_mutex; static struct fio_mutex *writeout_mutex; static struct flist_head *cgroup_list; @@ -87,6 +88,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 +107,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; @@ -958,10 +969,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 @@ -1004,11 +1017,11 @@ static void *thread_main(void *data) * 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; } @@ -1017,18 +1030,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. @@ -1039,29 +1058,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)) @@ -1070,16 +1090,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); @@ -1142,6 +1162,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) { @@ -1199,8 +1221,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"); } @@ -1298,6 +1320,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; } @@ -1309,6 +1332,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; } @@ -1352,9 +1376,6 @@ 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; @@ -1577,23 +1598,30 @@ static void run_threads(void) } update_io_ticks(); - fio_unpin_memory(); +} + +void wait_for_disk_thread_exit(void) +{ + fio_mutex_down(disk_thread_mutex); } static void *disk_thread_main(void *data) { + int ret = 0; + fio_mutex_up(startup_mutex); - while (threads) { + while (threads && !ret) { usleep(DISK_UTIL_MSEC * 1000); if (!threads) break; - update_io_ticks(); + ret = update_io_ticks(); if (!is_backend) print_thread_status(); } + fio_mutex_up(disk_thread_mutex); return NULL; } @@ -1601,14 +1629,20 @@ static int create_disk_util_thread(void) { int ret; + setup_disk_util(); + + disk_thread_mutex = fio_mutex_init(0); + ret = pthread_create(&disk_util_thread, NULL, disk_thread_main, NULL); if (ret) { + fio_mutex_remove(disk_thread_mutex); log_err("Can't create disk util thread: %s\n", strerror(ret)); return 1; } ret = pthread_detach(disk_util_thread); if (ret) { + fio_mutex_remove(disk_thread_mutex); log_err("Can't detatch disk util thread: %s\n", strerror(ret)); return 1; } @@ -1665,11 +1699,13 @@ 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); fio_mutex_remove(startup_mutex); fio_mutex_remove(writeout_mutex); + fio_mutex_remove(disk_thread_mutex); return exit_value; }