X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=workqueue.c;h=7a69be21803656a10326c1b525a58502289ee39c;hb=6d428bcd303e466403cebdedf20a5cf84f6949cd;hp=b9a967fdb2eb24a1ad22df4d823aff8134c8a6e0;hpb=bddc8d161ac433712d601765dbf455349f9dada1;p=fio.git diff --git a/workqueue.c b/workqueue.c index b9a967fd..7a69be21 100644 --- a/workqueue.c +++ b/workqueue.c @@ -124,6 +124,7 @@ int workqueue_enqueue(struct workqueue *wq, struct io_u *io_u) if (ddir_rw(ddir)) { parent->io_issues[ddir]++; parent->io_issue_bytes[ddir] += io_u->xfer_buflen; + parent->rate_io_issue_bytes[ddir] += io_u->xfer_buflen; } pthread_mutex_lock(&sw->lock); @@ -161,6 +162,7 @@ static int init_submit_worker(struct submit_worker *sw) memcpy(&td->ts, &parent->ts, sizeof(td->ts)); td->o.uid = td->o.gid = -1U; dup_files(td, parent); + td->eo = parent->eo; fio_options_mem_dupe(td); if (ioengine_load(td)) @@ -184,7 +186,7 @@ static int init_submit_worker(struct submit_worker *sw) fio_gettime(&td->epoch, NULL); fio_getrusage(&td->ru_start); - clear_io_state(td); + clear_io_state(td, 1); td_set_runstate(td, TD_RUNNING); td->flags |= TD_F_CHILD; @@ -197,6 +199,7 @@ err: return 1; } +#ifdef CONFIG_SFAA static void sum_val(uint64_t *dst, uint64_t *src) { if (*src) { @@ -204,15 +207,34 @@ static void sum_val(uint64_t *dst, uint64_t *src) *src = 0; } } +#else +static void sum_val(uint64_t *dst, uint64_t *src) +{ + if (*src) { + *dst += *src; + *src = 0; + } +} +#endif static void sum_ddir(struct thread_data *dst, struct thread_data *src, enum fio_ddir ddir) { +#ifndef CONFIG_SFAA + pthread_mutex_lock(&dst->io_wq.stat_lock); + pthread_mutex_lock(&src->io_wq.stat_lock); +#endif + sum_val(&dst->io_bytes[ddir], &src->io_bytes[ddir]); sum_val(&dst->io_blocks[ddir], &src->io_blocks[ddir]); 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]); + +#ifndef CONFIG_SFAA + pthread_mutex_unlock(&src->io_wq.stat_lock); + pthread_mutex_unlock(&dst->io_wq.stat_lock); +#endif } static void update_accounting(struct submit_worker *sw) @@ -355,6 +377,7 @@ void workqueue_exit(struct workqueue *wq) free(wq->workers); pthread_mutex_destroy(&wq->flush_lock); pthread_cond_destroy(&wq->flush_cond); + pthread_mutex_destroy(&wq->stat_lock); } static int start_worker(struct workqueue *wq, unsigned int index) @@ -393,6 +416,7 @@ int workqueue_init(struct thread_data *td, struct workqueue *wq, wq->next_free_worker = 0; pthread_cond_init(&wq->flush_cond, NULL); pthread_mutex_init(&wq->flush_lock, NULL); + pthread_mutex_init(&wq->stat_lock, NULL); wq->workers = calloc(wq->max_workers, sizeof(struct submit_worker));