diff options
-rw-r--r-- | kernel/workqueue.c | 5 |
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? */ |
653 | static bool too_many_workers(struct worker_pool *pool) | 654 | static 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 | } |