X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=2420d1039cd18cf1b99f4c10c6568f61ce42a678;hp=d20fc2451f551172328d44471aff3d3247fddda7;hb=03e20d687566753b90383571e5e152c5142bdffd;hpb=4b3b73f843c283b341ad16cd1eb4e7a12978de8e diff --git a/fio.c b/fio.c index d20fc245..2420d103 100644 --- a/fio.c +++ b/fio.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -62,7 +63,7 @@ static struct fio_mutex *startup_mutex; static struct fio_mutex *writeout_mutex; static volatile int fio_abort; static int exit_value; -static struct itimerval itimer; +static timer_t ival_timer; static pthread_t gtod_thread; static struct flist_head *cgroup_list; static char *cgroup_mnt; @@ -100,12 +101,12 @@ static void terminate_threads(int group_id) * if the thread is running, just let it exit */ if (td->runstate < TD_RUNNING) - kill(td->pid, SIGQUIT); + kill(td->pid, SIGTERM); else { struct ioengine_ops *ops = td->io_ops; - if (ops && (ops->flags & FIO_SIGQUIT)) - kill(td->pid, SIGQUIT); + if (ops && (ops->flags & FIO_SIGTERM)) + kill(td->pid, SIGTERM); } } } @@ -113,17 +114,21 @@ static void terminate_threads(int group_id) static void status_timer_arm(void) { - itimer.it_value.tv_sec = 0; - itimer.it_value.tv_usec = DISK_UTIL_MSEC * 1000; - setitimer(ITIMER_REAL, &itimer, NULL); + struct itimerspec value; + + value.it_value.tv_sec = 0; + value.it_value.tv_nsec = DISK_UTIL_MSEC * 1000000; + value.it_interval.tv_sec = 0; + value.it_interval.tv_nsec = DISK_UTIL_MSEC * 1000000; + + timer_settime(ival_timer, 0, &value, NULL); } -static void sig_alrm(int fio_unused sig) +static void ival_fn(union sigval sig) { if (threads) { update_io_ticks(); print_thread_status(); - status_timer_arm(); } } @@ -143,15 +148,33 @@ static void sig_int(int sig) } } +static void posix_timer_teardown(void) +{ + timer_delete(ival_timer); +} + +static void posix_timer_setup(void) +{ + struct sigevent evt; + + memset(&evt, 0, sizeof(evt)); + evt.sigev_notify = SIGEV_THREAD; + evt.sigev_notify_function = ival_fn; + +#ifndef __CYGWIN__ + if (timer_create(CLOCK_MONOTONIC, &evt, &ival_timer) < 0) + perror("timer_create"); +#else /* Windows (and thus Cygwin) doesn't have a monotonic clock */ + if (timer_create(CLOCK_REALTIME, &evt, &ival_timer) < 0) + perror("timer_create"); +#endif + +} + static void set_sig_handlers(void) { struct sigaction act; - memset(&act, 0, sizeof(act)); - act.sa_handler = sig_alrm; - act.sa_flags = SA_RESTART; - sigaction(SIGALRM, &act, NULL); - memset(&act, 0, sizeof(act)); act.sa_handler = sig_int; act.sa_flags = SA_RESTART; @@ -160,7 +183,7 @@ static void set_sig_handlers(void) memset(&act, 0, sizeof(act)); act.sa_handler = sig_quit; act.sa_flags = SA_RESTART; - sigaction(SIGQUIT, &act, NULL); + sigaction(SIGTERM, &act, NULL); } /* @@ -972,6 +995,8 @@ void reset_all_stats(struct thread_data *td) } fio_gettime(&tv, NULL); + td->ts.runtime[0] = 0; + td->ts.runtime[1] = 0; memcpy(&td->epoch, &tv, sizeof(tv)); memcpy(&td->start, &tv, sizeof(tv)); } @@ -1010,7 +1035,7 @@ static int exec_string(const char *string) */ static void *thread_main(void *data) { - unsigned long long runtime[2], elapsed; + unsigned long long elapsed; struct thread_data *td = data; pthread_condattr_t attr; int clear_state; @@ -1128,7 +1153,6 @@ static void *thread_main(void *data) fio_gettime(&td->epoch, NULL); getrusage(RUSAGE_SELF, &td->ts.ru_start); - runtime[0] = runtime[1] = 0; clear_state = 0; while (keep_running(td)) { fio_gettime(&td->start, NULL); @@ -1153,11 +1177,11 @@ static void *thread_main(void *data) if (td_read(td) && td->io_bytes[DDIR_READ]) { elapsed = utime_since_now(&td->start); - runtime[DDIR_READ] += elapsed; + td->ts.runtime[DDIR_READ] += elapsed; } if (td_write(td) && td->io_bytes[DDIR_WRITE]) { elapsed = utime_since_now(&td->start); - runtime[DDIR_WRITE] += elapsed; + td->ts.runtime[DDIR_WRITE] += elapsed; } if (td->error || td->terminate) @@ -1174,15 +1198,15 @@ static void *thread_main(void *data) do_verify(td); - runtime[DDIR_READ] += utime_since_now(&td->start); + td->ts.runtime[DDIR_READ] += utime_since_now(&td->start); if (td->error || td->terminate) break; } update_rusage_stat(td); - td->ts.runtime[0] = (runtime[0] + 999) / 1000; - td->ts.runtime[1] = (runtime[1] + 999) / 1000; + td->ts.runtime[0] = (td->ts.runtime[0] + 999) / 1000; + td->ts.runtime[1] = (td->ts.runtime[1] + 999) / 1000; td->ts.total_run_time = mtime_since_now(&td->epoch); td->ts.io_bytes[0] = td->io_bytes[0]; td->ts.io_bytes[1] = td->io_bytes[1]; @@ -1334,7 +1358,7 @@ static void reap_threads(int *nr_running, int *t_rate, int *m_rate) if (WIFSIGNALED(status)) { int sig = WTERMSIG(status); - if (sig != SIGQUIT) + if (sig != SIGTERM) log_err("fio: pid=%d, got signal=%d\n", (int) td->pid, sig); td_set_runstate(td, TD_REAPED); @@ -1685,10 +1709,15 @@ int main(int argc, char *argv[]) } startup_mutex = fio_mutex_init(0); + if (startup_mutex == NULL) + return 1; writeout_mutex = fio_mutex_init(1); + if (writeout_mutex == NULL) + return 1; set_genesis_time(); + posix_timer_setup(); status_timer_arm(); cgroup_list = smalloc(sizeof(*cgroup_list)); @@ -1709,6 +1738,7 @@ int main(int argc, char *argv[]) sfree(cgroup_list); sfree(cgroup_mnt); + posix_timer_teardown(); fio_mutex_remove(startup_mutex); fio_mutex_remove(writeout_mutex); return exit_value;