From: Jens Axboe Date: Tue, 8 Dec 2015 15:44:56 +0000 (-0700) Subject: workqueue: move last bits of end accounting to caller X-Git-Tag: fio-2.2.13~29 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=c35c582da92f613e56294e2d94b52a80c63c2ae3;p=fio.git workqueue: move last bits of end accounting to caller Signed-off-by: Jens Axboe --- diff --git a/backend.c b/backend.c index c208b227..c18cf209 100644 --- a/backend.c +++ b/backend.c @@ -1492,10 +1492,14 @@ err: } -static void io_workqueue_exit_worker_fn(struct submit_worker *sw) +static void io_workqueue_exit_worker_fn(struct submit_worker *sw, + unsigned int *sum_cnt) { struct thread_data *td = sw->private; + (*sum_cnt)++; + sum_thread_stats(&sw->wq->td->ts, &td->ts, *sum_cnt == 1); + fio_options_free(td); close_and_free_files(td); if (td->io_ops) diff --git a/workqueue.c b/workqueue.c index 484d3a92..9fe7bec1 100644 --- a/workqueue.c +++ b/workqueue.c @@ -204,11 +204,11 @@ done: return NULL; } -static void free_worker(struct submit_worker *sw) +static void free_worker(struct submit_worker *sw, unsigned int *sum_cnt) { struct workqueue *wq = sw->wq; - workqueue_exit_worker(sw); + workqueue_exit_worker(sw, sum_cnt); pthread_cond_destroy(&sw->cond); pthread_mutex_destroy(&sw->lock); @@ -219,13 +219,8 @@ static void free_worker(struct submit_worker *sw) static void shutdown_worker(struct submit_worker *sw, unsigned int *sum_cnt) { - struct thread_data *parent = sw->wq->td; - struct thread_data *td = sw->private; - pthread_join(sw->thread, NULL); - (*sum_cnt)++; - sum_thread_stats(&parent->ts, &td->ts, *sum_cnt == 1); - free_worker(sw); + free_worker(sw, sum_cnt); } void workqueue_exit(struct workqueue *wq) @@ -288,7 +283,7 @@ static int start_worker(struct workqueue *wq, unsigned int index) return 0; } - free_worker(sw); + free_worker(sw, NULL); return 1; } diff --git a/workqueue.h b/workqueue.h index 3119ff17..c2464b27 100644 --- a/workqueue.h +++ b/workqueue.h @@ -25,7 +25,7 @@ typedef void (workqueue_pre_sleep_fn)(struct submit_worker *); typedef int (workqueue_alloc_worker_fn)(struct submit_worker *); typedef void (workqueue_free_worker_fn)(struct submit_worker *); typedef int (workqueue_init_worker_fn)(struct submit_worker *); -typedef void (workqueue_exit_worker_fn)(struct submit_worker *); +typedef void (workqueue_exit_worker_fn)(struct submit_worker *, unsigned int *); typedef void (workqueue_update_acct_fn)(struct submit_worker *); struct workqueue_ops { @@ -92,13 +92,18 @@ static inline int workqueue_init_worker(struct submit_worker *sw) return wq->ops.init_worker_fn(sw); } -static inline void workqueue_exit_worker(struct submit_worker *sw) +static inline void workqueue_exit_worker(struct submit_worker *sw, + unsigned int *sum_cnt) { struct workqueue *wq = sw->wq; + unsigned int tmp = 1; if (!wq->ops.exit_worker_fn) return; - wq->ops.exit_worker_fn(sw); + if (!sum_cnt) + sum_cnt = &tmp; + + wq->ops.exit_worker_fn(sw, sum_cnt); } #endif