X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=8141991c27ca2619fe630aa903a7c4a959cb1e80;hp=d30ff4b3467dc352feec1de944c71c15716c017e;hb=e1161c325f7866bae879e686d1c673ca32ab09ae;hpb=0c6e75175bcaf8d05bfa88aa8caa584fbb848b74 diff --git a/io_u.c b/io_u.c index d30ff4b3..8141991c 100644 --- a/io_u.c +++ b/io_u.c @@ -548,7 +548,7 @@ long io_u_queued_complete(struct thread_data *td, int min_events, if (min_events > 0) { ret = td_io_commit(td); if (ret < 0) { - td_verror(td, -ret); + td_verror(td, -ret, "td_io_commit"); return ret; } } else { @@ -559,7 +559,7 @@ long io_u_queued_complete(struct thread_data *td, int min_events, ret = td_io_getevents(td, min_events, td->cur_depth, tvp); if (ret < 0) { - td_verror(td, -ret); + td_verror(td, -ret, "td_io_getevents"); return ret; } else if (!ret) return ret; @@ -582,3 +582,64 @@ void io_u_queued(struct thread_data *td, struct io_u *io_u) slat_time = mtime_since(&io_u->start_time, &io_u->issue_time); add_slat_sample(td, io_u->ddir, slat_time); } + +#ifdef FIO_USE_TIMEOUT +void io_u_set_timeout(struct thread_data *td) +{ + assert(td->cur_depth); + + td->timer.it_interval.tv_sec = 0; + td->timer.it_interval.tv_usec = 0; + td->timer.it_value.tv_sec = IO_U_TIMEOUT + IO_U_TIMEOUT_INC; + td->timer.it_value.tv_usec = 0; + setitimer(ITIMER_REAL, &td->timer, NULL); + fio_gettime(&td->timeout_end, NULL); +} +#else +void io_u_set_timeout(struct thread_data fio_unused *td) +{ +} +#endif + +#ifdef FIO_USE_TIMEOUT +static void io_u_timeout_handler(int fio_unused sig) +{ + struct thread_data *td, *__td; + pid_t pid = getpid(); + int i; + + log_err("fio: io_u timeout\n"); + + /* + * TLS would be nice... + */ + td = NULL; + for_each_td(__td, i) { + if (__td->pid == pid) { + td = __td; + break; + } + } + + if (!td) { + log_err("fio: io_u timeout, can't find job\n"); + exit(1); + } + + if (!td->cur_depth) { + log_err("fio: timeout without pending work?\n"); + return; + } + + log_err("fio: io_u timeout: job=%s, pid=%d\n", td->name, td->pid); + td->error = ETIMEDOUT; + exit(1); +} +#endif + +void io_u_init_timeout(void) +{ +#ifdef FIO_USE_TIMEOUT + signal(SIGALRM, io_u_timeout_handler); +#endif +}