X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=276f3b0cd2ddf41c3a007e7a4e3aa74255a2a42a;hp=e218a30f6f24da6a2cfc6134717c3d04ad6305c1;hb=c1f75438a5888d96b3aa4f6a0cac50c4d4047f14;hpb=1621031e8a7cbb91afad124da405fc4eabda764f diff --git a/io_u.c b/io_u.c index e218a30f..276f3b0c 100644 --- a/io_u.c +++ b/io_u.c @@ -412,6 +412,12 @@ void put_io_u(struct thread_data *td, struct io_u *io_u) td->cur_depth--; } +void clear_io_u(struct thread_data *td, struct io_u *io_u) +{ + io_u->flags &= ~IO_U_F_FLIGHT; + put_io_u(td, io_u); +} + void requeue_io_u(struct thread_data *td, struct io_u **io_u) { struct io_u *__io_u = *io_u; @@ -661,7 +667,8 @@ static void io_u_mark_latency(struct thread_data *td, unsigned long usec) /* * Get next file to service by choosing one at random */ -static struct fio_file *get_next_file_rand(struct thread_data *td, enum fio_file_flags goodf, +static struct fio_file *get_next_file_rand(struct thread_data *td, + enum fio_file_flags goodf, enum fio_file_flags badf) { struct fio_file *f; @@ -952,21 +959,29 @@ static void io_completed(struct thread_data *td, struct io_u *io_u, td->this_io_bytes[idx] += bytes; if (ramp_time_over(td)) { - if (!td->o.disable_clat || !td->o.disable_bw || - __should_check_rate(td, idx)) - usec = utime_since(&io_u->issue_time, + unsigned long uninitialized_var(lusec); + unsigned long uninitialized_var(rusec); + + if (!td->o.disable_clat || !td->o.disable_bw) + lusec = utime_since(&io_u->issue_time, + &icd->time); + if (__should_check_rate(td, idx) || + __should_check_rate(td, idx ^ 1)) + rusec = utime_since(&io_u->start_time, &icd->time); if (!td->o.disable_clat) { add_clat_sample(td, idx, usec, bytes); - io_u_mark_latency(td, usec); + io_u_mark_latency(td, lusec); } if (!td->o.disable_bw) add_bw_sample(td, idx, bytes, &icd->time); - if (__should_check_rate(td, idx)) - td->rate_pending_usleep[idx] += (long) td->rate_usec_cycle[idx] - usec; + if (__should_check_rate(td, idx)) { + td->rate_pending_usleep[idx] += + (long) td->rate_usec_cycle[idx] - rusec; + } if (__should_check_rate(td, idx ^ 1)) - td->rate_pending_usleep[idx ^ 1] -= usec; + td->rate_pending_usleep[idx ^ 1] -= rusec; } if (td_write(td) && idx == DDIR_WRITE && @@ -985,6 +1000,17 @@ static void io_completed(struct thread_data *td, struct io_u *io_u, icd->error = io_u->error; io_u_log_error(td, io_u); } + if (td->o.continue_on_error && icd->error && + td_non_fatal_error(icd->error)) { + /* + * If there is a non_fatal error, then add to the error count + * and clear all the errors. + */ + update_error_count(td, icd->error); + td_clear_error(td); + icd->error = 0; + io_u->error = 0; + } } static void init_icd(struct thread_data *td, struct io_completion_data *icd, @@ -1085,7 +1111,7 @@ void io_u_queued(struct thread_data *td, struct io_u *io_u) unsigned long slat_time; slat_time = utime_since(&io_u->start_time, &io_u->issue_time); - add_slat_sample(td, io_u->ddir, io_u->xfer_buflen, slat_time); + add_slat_sample(td, io_u->ddir, slat_time, io_u->xfer_buflen); } }