On Tue, Oct 22, 2013 at 04:13:13PM +0900, Hitoshi Mitake wrote: > 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); >
This is wrong because we need pending_lock to protect nr_threads. Thanks Yuan -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog