X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=rate-submit.c;h=103a80aa13f8e671f06d2b568f7fa8bc1cc342df;hb=0dc6e911832fca2c5cf9a5ac2663b468ef2c4341;hp=b7b703722bbb102c84e0dbfd1fed7be0b35727e5;hpb=fa443634fbfa38fd5d6418a96a45022c78b90df4;p=fio.git diff --git a/rate-submit.c b/rate-submit.c index b7b70372..103a80aa 100644 --- a/rate-submit.c +++ b/rate-submit.c @@ -12,8 +12,7 @@ static void check_overlap(struct io_u *io_u) { - int i, res; - struct thread_data *td; + int res; /* * Allow only one thread to check for overlap at a time to prevent two @@ -31,7 +30,7 @@ static void check_overlap(struct io_u *io_u) assert(res == 0); retry: - for_each_td(td, i) { + for_each_td(td) { if (td->runstate <= TD_SETTING_UP || td->runstate >= TD_FINISHING || !td->o.serialize_overlap || @@ -46,7 +45,7 @@ retry: res = pthread_mutex_lock(&overlap_check); assert(res == 0); goto retry; - } + } end_for_each(); } static int io_workqueue_fn(struct submit_worker *sw, @@ -97,8 +96,11 @@ static int io_workqueue_fn(struct submit_worker *sw, td->cur_depth -= ret; } - if (error || td->error) + if (error || td->error) { + pthread_mutex_lock(&td->io_u_lock); pthread_cond_signal(&td->parent->free_cond); + pthread_mutex_unlock(&td->io_u_lock); + } return 0; } @@ -151,6 +153,7 @@ static int io_workqueue_init_worker_fn(struct submit_worker *sw) dup_files(td, parent); td->eo = parent->eo; fio_options_mem_dupe(td); + td->iolog_f = parent->iolog_f; if (ioengine_load(td)) goto err; @@ -170,7 +173,7 @@ static int io_workqueue_init_worker_fn(struct submit_worker *sw) if (td->io_ops->post_init && td->io_ops->post_init(td)) goto err_io_init; - set_epoch_time(td, td->o.log_unix_epoch); + set_epoch_time(td, td->o.log_unix_epoch | td->o.log_alternate_epoch, td->o.log_alternate_epoch_clock_id); fio_getrusage(&td->ru_start); clear_io_state(td, 1); @@ -192,7 +195,16 @@ static void io_workqueue_exit_worker_fn(struct submit_worker *sw, struct thread_data *td = sw->priv; (*sum_cnt)++; - sum_thread_stats(&sw->wq->td->ts, &td->ts, *sum_cnt == 1); + + /* + * io_workqueue_update_acct_fn() doesn't support per prio stats, and + * even if it did, offload can't be used with all async IO engines. + * If group reporting is set in the parent td, the group result + * generated by __show_run_stats() can still contain multiple prios + * from different offloaded jobs. + */ + sw->wq->td->ts.disable_prio_stat = 1; + sum_thread_stats(&sw->wq->td->ts, &td->ts); fio_options_free(td); close_and_free_files(td); @@ -251,6 +263,8 @@ static void sum_ddir(struct thread_data *dst, struct thread_data *src, sum_val(&dst->this_io_blocks[ddir], &src->this_io_blocks[ddir]); sum_val(&dst->this_io_bytes[ddir], &src->this_io_bytes[ddir]); sum_val(&dst->bytes_done[ddir], &src->bytes_done[ddir]); + if (ddir == DDIR_READ) + sum_val(&dst->bytes_verified, &src->bytes_verified); pthread_double_unlock(&dst->io_wq.stat_lock, &src->io_wq.stat_lock); }