X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=2a468b134de5bb02ed3ee4dece8b8ea9b645b2b8;hp=5a87ae4b000fe377ad9970fa7971f725c287c020;hb=4e78e405a12b31291aa88fffc1da2cf43b782ef5;hpb=e3cedca76d9fc104eb4f6f869606fb5bf4c0d59c diff --git a/fio.c b/fio.c index 5a87ae4b..2a468b13 100644 --- a/fio.c +++ b/fio.c @@ -55,6 +55,7 @@ static struct fio_mutex *startup_mutex; static volatile int fio_abort; static int exit_value; static struct itimerval itimer; +static pthread_t gtod_thread; struct io_log *agg_io_log[2]; @@ -672,7 +673,7 @@ sync_done: int left; if (td->o.thinktime_spin) - __usec_sleep(td->o.thinktime_spin); + usec_spin(td->o.thinktime_spin); left = td->o.thinktime - td->o.thinktime_spin; if (left) @@ -964,6 +965,18 @@ static void *thread_main(void *data) goto err; } + /* + * 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 (fio_setaffinity(td) == -1) { + td_verror(td, errno, "cpu_set_affinity"); + goto err; + } + } + if (td->ioprio_set) { if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) { td_verror(td, errno, "ioprio_set"); @@ -1067,21 +1080,24 @@ static void *thread_main(void *data) td->ts.io_bytes[1] = td->io_bytes[1]; if (td->ts.bw_log) { - if (td->o.bw_log_file) - finish_log_named(td, td->ts.bw_log, td->o.bw_log_file, "bw"); - else + if (td->o.bw_log_file) { + finish_log_named(td, td->ts.bw_log, + td->o.bw_log_file, "bw"); + } else finish_log(td, td->ts.bw_log, "bw"); } if (td->ts.slat_log) { - if (td->o.lat_log_file) - finish_log_named(td, td->ts.slat_log, td->o.lat_log_file, "clat"); - else + if (td->o.lat_log_file) { + finish_log_named(td, td->ts.slat_log, + td->o.lat_log_file, "clat"); + } else finish_log(td, td->ts.slat_log, "slat"); } if (td->ts.clat_log) { - if (td->o.lat_log_file) - finish_log_named(td, td->ts.clat_log, td->o.lat_log_file, "clat"); - else + if (td->o.lat_log_file) { + finish_log_named(td, td->ts.clat_log, + td->o.lat_log_file, "clat"); + } else finish_log(td, td->ts.clat_log, "clat"); } if (td->o.exec_postrun) { @@ -1100,6 +1116,9 @@ err: close_ioengine(td); cleanup_io_u(td); + if (td->o.cpumask_set) + fio_cpuset_exit(td); + /* * do this very late, it will log file closing as well */ @@ -1229,6 +1248,39 @@ reaped: terminate_threads(TERMINATE_ALL); } +static void *gtod_thread_main(void *data) +{ + fio_mutex_up(startup_mutex); + + /* + * As long as we have jobs around, update the clock. It would be nice + * to have some way of NOT hammering that CPU with gettimeofday(), + * but I'm not sure what to use outside of a simple CPU nop to relax + * it - we don't want to lose precision. + */ + while (threads) { + fio_gtod_update(); + nop; + } + + return NULL; +} + +static int fio_start_gtod_thread(void) +{ + if (pthread_create(>od_thread, NULL, gtod_thread_main, NULL)) { + perror("Can't create gtod thread"); + return 1; + } + if (pthread_detach(gtod_thread) < 0) { + perror("Can't detatch gtod thread"); + return 1; + } + + fio_mutex_down(startup_mutex); + return 0; +} + /* * Main function for kicking off and reaping jobs, as needed. */ @@ -1241,6 +1293,9 @@ static void run_threads(void) if (fio_pin_memory()) return; + if (fio_gtod_offload && fio_start_gtod_thread()) + return; + if (!terse_output) { printf("Starting "); if (nr_thread)