From bc9b9df61515112d23445bd4594e53b274027a1d Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Wed, 20 Mar 2013 10:52:30 -0700 Subject: [PATCH] --- yaml --- r: 365530 b: refs/heads/master c: 951a078a5285ad31bc22e190616ad54b78fac992 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/workqueue.c | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 5c0edbbff0c6..64ce8373c736 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6a092dfd51e5af9b321d683d4b4eddc79e2606ed +refs/heads/master: 951a078a5285ad31bc22e190616ad54b78fac992 diff --git a/trunk/kernel/workqueue.c b/trunk/kernel/workqueue.c index d2ac6cbfe8ab..79d1d347e690 100644 --- a/trunk/kernel/workqueue.c +++ b/trunk/kernel/workqueue.c @@ -3598,6 +3598,12 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) while (!list_empty(&pwq->delayed_works) && pwq->nr_active < pwq->max_active) pwq_activate_first_delayed(pwq); + + /* + * Need to kick a worker after thawed or an unbound wq's + * max_active is bumped. It's a slow path. Do it always. + */ + wake_up_worker(pwq->pool); } else { pwq->max_active = 0; } @@ -4401,13 +4407,6 @@ void thaw_workqueues(void) } spin_unlock_irq(&pwq_lock); - /* kick workers */ - for_each_pool(pool, pi) { - spin_lock_irq(&pool->lock); - wake_up_worker(pool); - spin_unlock_irq(&pool->lock); - } - workqueue_freezing = false; out_unlock: mutex_unlock(&wq_mutex);