[PATCH 2/7] workqueue: set __WQ_FREEZING only when freezable
simplify pwq_adjust_max_active(). make freeze_workqueues_begin() and thaw_workqueues() fast skip non-freezable wq. Signed-off-by: Lai Jiangshan --- kernel/workqueue.c | 13 ++--- 1 files changed, 6 insertions(+), 7 deletions(-) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index e06a5b0..66a9d71 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -3644,18 +3644,13 @@ static void pwq_unbound_release_workfn(struct work_struct *work) static void pwq_adjust_max_active(struct pool_workqueue *pwq) { struct workqueue_struct *wq = pwq->wq; - bool freezable = wq->flags & WQ_FREEZABLE; /* for @wq->saved_max_active and @wq->flags */ lockdep_assert_held(>mutex); - /* fast exit for non-freezable wqs */ - if (!freezable && pwq->max_active == wq->saved_max_active) - return; - spin_lock_irq(>pool->lock); - if (!freezable || !(wq->flags & __WQ_FREEZING)) { + if (!(wq->flags & __WQ_FREEZING)) { pwq->max_active = wq->saved_max_active; while (!list_empty(>delayed_works) && @@ -4151,7 +4146,7 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt, mutex_lock(_pool_mutex); mutex_lock(>mutex); - if (workqueue_freezing) + if ((wq->flags & WQ_FREEZABLE) && workqueue_freezing) wq->flags |= __WQ_FREEZING; for_each_pwq(pwq, wq) pwq_adjust_max_active(pwq); @@ -4677,6 +4672,8 @@ void freeze_workqueues_begin(void) workqueue_freezing = true; list_for_each_entry(wq, , list) { + if (!(wq->flags & WQ_FREEZABLE)) + continue; mutex_lock(>mutex); WARN_ON_ONCE(wq->flags & __WQ_FREEZING); wq->flags |= __WQ_FREEZING; @@ -4755,6 +4752,8 @@ void thaw_workqueues(void) /* restore max_active and repopulate worklist */ list_for_each_entry(wq, , list) { + if (!(wq->flags & WQ_FREEZABLE)) + continue; mutex_lock(>mutex); wq->flags &= ~__WQ_FREEZING; for_each_pwq(pwq, wq) -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/7] workqueue: set __WQ_FREEZING only when freezable
simplify pwq_adjust_max_active(). make freeze_workqueues_begin() and thaw_workqueues() fast skip non-freezable wq. Signed-off-by: Lai Jiangshan la...@cn.fujitsu.com --- kernel/workqueue.c | 13 ++--- 1 files changed, 6 insertions(+), 7 deletions(-) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index e06a5b0..66a9d71 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -3644,18 +3644,13 @@ static void pwq_unbound_release_workfn(struct work_struct *work) static void pwq_adjust_max_active(struct pool_workqueue *pwq) { struct workqueue_struct *wq = pwq-wq; - bool freezable = wq-flags WQ_FREEZABLE; /* for @wq-saved_max_active and @wq-flags */ lockdep_assert_held(wq-mutex); - /* fast exit for non-freezable wqs */ - if (!freezable pwq-max_active == wq-saved_max_active) - return; - spin_lock_irq(pwq-pool-lock); - if (!freezable || !(wq-flags __WQ_FREEZING)) { + if (!(wq-flags __WQ_FREEZING)) { pwq-max_active = wq-saved_max_active; while (!list_empty(pwq-delayed_works) @@ -4151,7 +4146,7 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt, mutex_lock(wq_pool_mutex); mutex_lock(wq-mutex); - if (workqueue_freezing) + if ((wq-flags WQ_FREEZABLE) workqueue_freezing) wq-flags |= __WQ_FREEZING; for_each_pwq(pwq, wq) pwq_adjust_max_active(pwq); @@ -4677,6 +4672,8 @@ void freeze_workqueues_begin(void) workqueue_freezing = true; list_for_each_entry(wq, workqueues, list) { + if (!(wq-flags WQ_FREEZABLE)) + continue; mutex_lock(wq-mutex); WARN_ON_ONCE(wq-flags __WQ_FREEZING); wq-flags |= __WQ_FREEZING; @@ -4755,6 +4752,8 @@ void thaw_workqueues(void) /* restore max_active and repopulate worklist */ list_for_each_entry(wq, workqueues, list) { + if (!(wq-flags WQ_FREEZABLE)) + continue; mutex_lock(wq-mutex); wq-flags = ~__WQ_FREEZING; for_each_pwq(pwq, wq) -- 1.7.7.6 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/