From 17ecadc3fababaace961051765f140d3332d362d Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 8 Dec 2015 08:36:01 -0700 Subject: [PATCH] workqueue: move private accounting to caller Signed-off-by: Jens Axboe --- backend.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ workqueue.c | 74 ++++------------------------------------------------- workqueue.h | 3 +++ 3 files changed, 77 insertions(+), 69 deletions(-) diff --git a/backend.c b/backend.c index c1274985..c208b227 100644 --- a/backend.c +++ b/backend.c @@ -1503,10 +1503,79 @@ static void io_workqueue_exit_worker_fn(struct submit_worker *sw) td_set_runstate(td, TD_EXITED); } +#ifdef CONFIG_SFAA +static void sum_val(uint64_t *dst, uint64_t *src) +{ + if (*src) { + __sync_fetch_and_add(dst, *src); + *src = 0; + } +} +#else +static void sum_val(uint64_t *dst, uint64_t *src) +{ + if (*src) { + *dst += *src; + *src = 0; + } +} +#endif + +static void pthread_double_unlock(pthread_mutex_t *lock1, + pthread_mutex_t *lock2) +{ +#ifndef CONFIG_SFAA + pthread_mutex_unlock(lock1); + pthread_mutex_unlock(lock2); +#endif +} + +static void pthread_double_lock(pthread_mutex_t *lock1, pthread_mutex_t *lock2) +{ +#ifndef CONFIG_SFAA + if (lock1 < lock2) { + pthread_mutex_lock(lock1); + pthread_mutex_lock(lock2); + } else { + pthread_mutex_lock(lock2); + pthread_mutex_lock(lock1); + } +#endif +} + +static void sum_ddir(struct thread_data *dst, struct thread_data *src, + enum fio_ddir ddir) +{ + pthread_double_lock(&dst->io_wq.stat_lock, &src->io_wq.stat_lock); + + 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]); + + pthread_double_unlock(&dst->io_wq.stat_lock, &src->io_wq.stat_lock); +} + +static void io_workqueue_update_acct_fn(struct submit_worker *sw) +{ + struct thread_data *src = sw->private; + struct thread_data *dst = sw->wq->td; + + if (td_read(src)) + sum_ddir(dst, src, DDIR_READ); + if (td_write(src)) + sum_ddir(dst, src, DDIR_WRITE); + if (td_trim(src)) + sum_ddir(dst, src, DDIR_TRIM); + +} + struct workqueue_ops rated_wq_ops = { .fn = io_workqueue_fn, .pre_sleep_flush_fn = io_workqueue_pre_sleep_flush_fn, .pre_sleep_fn = io_workqueue_pre_sleep_fn, + .update_acct_fn = io_workqueue_update_acct_fn, .alloc_worker_fn = io_workqueue_alloc_fn, .free_worker_fn = io_workqueue_free_fn, .init_worker_fn = io_workqueue_init_worker_fn, diff --git a/workqueue.c b/workqueue.c index f26d9d7b..484d3a92 100644 --- a/workqueue.c +++ b/workqueue.c @@ -130,73 +130,6 @@ static void handle_list(struct submit_worker *sw, struct flist_head *list) } } -#ifdef CONFIG_SFAA -static void sum_val(uint64_t *dst, uint64_t *src) -{ - if (*src) { - __sync_fetch_and_add(dst, *src); - *src = 0; - } -} -#else -static void sum_val(uint64_t *dst, uint64_t *src) -{ - if (*src) { - *dst += *src; - *src = 0; - } -} -#endif - -static void pthread_double_unlock(pthread_mutex_t *lock1, - pthread_mutex_t *lock2) -{ -#ifndef CONFIG_SFAA - pthread_mutex_unlock(lock1); - pthread_mutex_unlock(lock2); -#endif -} - -static void pthread_double_lock(pthread_mutex_t *lock1, pthread_mutex_t *lock2) -{ -#ifndef CONFIG_SFAA - if (lock1 < lock2) { - pthread_mutex_lock(lock1); - pthread_mutex_lock(lock2); - } else { - pthread_mutex_lock(lock2); - pthread_mutex_lock(lock1); - } -#endif -} - -static void sum_ddir(struct thread_data *dst, struct thread_data *src, - enum fio_ddir ddir) -{ - pthread_double_lock(&dst->io_wq.stat_lock, &src->io_wq.stat_lock); - - 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]); - - pthread_double_unlock(&dst->io_wq.stat_lock, &src->io_wq.stat_lock); -} - -static void update_accounting(struct submit_worker *sw) -{ - struct thread_data *src = sw->private; - struct thread_data *dst = sw->wq->td; - - if (td_read(src)) - sum_ddir(dst, src, DDIR_READ); - if (td_write(src)) - sum_ddir(dst, src, DDIR_WRITE); - if (td_trim(src)) - sum_ddir(dst, src, DDIR_TRIM); -} - static void *worker_thread(void *data) { struct submit_worker *sw = data; @@ -249,7 +182,9 @@ static void *worker_thread(void *data) if (wq->wake_idle) pthread_cond_signal(&wq->flush_cond); } - update_accounting(sw); + if (wq->ops.update_acct_fn) + wq->ops.update_acct_fn(sw); + pthread_cond_wait(&sw->cond, &sw->lock); } else { handle_work: @@ -259,7 +194,8 @@ handle_work: handle_list(sw, &local_list); } - update_accounting(sw); + if (wq->ops.update_acct_fn) + wq->ops.update_acct_fn(sw); done: pthread_mutex_lock(&sw->lock); diff --git a/workqueue.h b/workqueue.h index d36f4211..3119ff17 100644 --- a/workqueue.h +++ b/workqueue.h @@ -26,12 +26,15 @@ 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_update_acct_fn)(struct submit_worker *); struct workqueue_ops { workqueue_work_fn *fn; workqueue_pre_sleep_flush_fn *pre_sleep_flush_fn; workqueue_pre_sleep_fn *pre_sleep_fn; + workqueue_update_acct_fn *update_acct_fn; + workqueue_alloc_worker_fn *alloc_worker_fn; workqueue_free_worker_fn *free_worker_fn; -- 2.25.1