Current queue_work() locks worker_info->pending_lock before growing a
number of worker threads (if it is required). Clearly this behavior
harms performance. This patch makes the lock fine grain.

Signed-off-by: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp>
---
 lib/work.c |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/lib/work.c b/lib/work.c
index 57b38dd..d27aee1 100644
--- a/lib/work.c
+++ b/lib/work.c
@@ -232,12 +232,11 @@ void queue_work(struct work_queue *q, struct work *work)
        struct worker_info *wi = container_of(q, struct worker_info, q);
 
        uatomic_inc(&wi->nr_queued_work);
-       pthread_mutex_lock(&wi->pending_lock);
-
        if (wq_need_grow(wi))
                /* double the thread pool size */
                create_worker_threads(wi, wi->nr_threads * 2);
 
+       pthread_mutex_lock(&wi->pending_lock);
        list_add_tail(&work->w_list, &wi->q.pending_list);
        pthread_mutex_unlock(&wi->pending_lock);
 
-- 
1.7.10.4

-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to