With the scheduled unbound pools with custom attributes, there will be
multiple unbound pools, so it wouldn't be able to use
for_each_wq_cpu() + for_each_std_worker_pool() to iterate through all
pools.

Introduce for_each_pool() which iterates through all pools using
worker_pool_idr and use it instead of for_each_wq_cpu() +
for_each_std_worker_pool() combination in freeze_workqueues_begin().

Signed-off-by: Tejun Heo <t...@kernel.org>
---
 kernel/workqueue.c | 36 +++++++++++++++++++++---------------
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 0055a31..869dbcc 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -295,6 +295,14 @@ static inline int __next_wq_cpu(int cpu, const struct 
cpumask *mask,
             (cpu) = __next_wq_cpu((cpu), cpu_online_mask, 3))
 
 /**
+ * for_each_pool - iterate through all worker_pools in the system
+ * @pool: iteration cursor
+ * @id: integer used for iteration
+ */
+#define for_each_pool(pool, id)                                                
\
+       idr_for_each_entry(&worker_pool_idr, pool, id)
+
+/**
  * for_each_pwq - iterate through all pool_workqueues of the specified 
workqueue
  * @pwq: iteration cursor
  * @wq: the target workqueue
@@ -3589,33 +3597,31 @@ EXPORT_SYMBOL_GPL(work_on_cpu);
  */
 void freeze_workqueues_begin(void)
 {
-       unsigned int cpu;
+       struct worker_pool *pool;
+       int id;
 
        spin_lock_irq(&workqueue_lock);
 
        WARN_ON_ONCE(workqueue_freezing);
        workqueue_freezing = true;
 
-       for_each_wq_cpu(cpu) {
-               struct worker_pool *pool;
+       for_each_pool(pool, id) {
                struct workqueue_struct *wq;
 
-               for_each_std_worker_pool(pool, cpu) {
-                       spin_lock(&pool->lock);
-
-                       WARN_ON_ONCE(pool->flags & POOL_FREEZING);
-                       pool->flags |= POOL_FREEZING;
+               spin_lock(&pool->lock);
 
-                       list_for_each_entry(wq, &workqueues, list) {
-                               struct pool_workqueue *pwq = get_pwq(cpu, wq);
+               WARN_ON_ONCE(pool->flags & POOL_FREEZING);
+               pool->flags |= POOL_FREEZING;
 
-                               if (pwq && pwq->pool == pool &&
-                                   (wq->flags & WQ_FREEZABLE))
-                                       pwq->max_active = 0;
-                       }
+               list_for_each_entry(wq, &workqueues, list) {
+                       struct pool_workqueue *pwq = get_pwq(pool->cpu, wq);
 
-                       spin_unlock(&pool->lock);
+                       if (pwq && pwq->pool == pool &&
+                           (wq->flags & WQ_FREEZABLE))
+                               pwq->max_active = 0;
                }
+
+               spin_unlock(&pool->lock);
        }
 
        spin_unlock_irq(&workqueue_lock);
-- 
1.8.1.2

--
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/

Reply via email to