aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/workqueue.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index dc7b8458e275..383548ed0b54 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -66,6 +66,7 @@ enum {
66 66
67 /* pool flags */ 67 /* pool flags */
68 POOL_MANAGE_WORKERS = 1 << 0, /* need to manage workers */ 68 POOL_MANAGE_WORKERS = 1 << 0, /* need to manage workers */
69 POOL_MANAGING_WORKERS = 1 << 1, /* managing workers */
69 70
70 /* worker flags */ 71 /* worker flags */
71 WORKER_STARTED = 1 << 0, /* started */ 72 WORKER_STARTED = 1 << 0, /* started */
@@ -652,7 +653,7 @@ static bool need_to_manage_workers(struct worker_pool *pool)
652/* Do we have too many workers and should some go away? */ 653/* Do we have too many workers and should some go away? */
653static bool too_many_workers(struct worker_pool *pool) 654static bool too_many_workers(struct worker_pool *pool)
654{ 655{
655 bool managing = mutex_is_locked(&pool->manager_mutex); 656 bool managing = pool->flags & POOL_MANAGING_WORKERS;
656 int nr_idle = pool->nr_idle + managing; /* manager is considered idle */ 657 int nr_idle = pool->nr_idle + managing; /* manager is considered idle */
657 int nr_busy = pool->nr_workers - nr_idle; 658 int nr_busy = pool->nr_workers - nr_idle;
658 659
@@ -1827,6 +1828,7 @@ static bool manage_workers(struct worker *worker)
1827 if (!mutex_trylock(&pool->manager_mutex)) 1828 if (!mutex_trylock(&pool->manager_mutex))
1828 return ret; 1829 return ret;
1829 1830
1831 pool->flags |= POOL_MANAGING_WORKERS;
1830 pool->flags &= ~POOL_MANAGE_WORKERS; 1832 pool->flags &= ~POOL_MANAGE_WORKERS;
1831 1833
1832 /* 1834 /*
@@ -1836,6 +1838,7 @@ static bool manage_workers(struct worker *worker)
1836 ret |= maybe_destroy_workers(pool); 1838 ret |= maybe_destroy_workers(pool);
1837 ret |= maybe_create_worker(pool); 1839 ret |= maybe_create_worker(pool);
1838 1840
1841 pool->flags &= ~POOL_MANAGING_WORKERS;
1839 mutex_unlock(&pool->manager_mutex); 1842 mutex_unlock(&pool->manager_mutex);
1840 return ret; 1843 return ret;
1841} 1844}