diff options
author | Tejun Heo <tj@kernel.org> | 2010-06-29 04:07:12 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-06-29 04:07:12 -0400 |
commit | a0a1a5fd4fb15ec61117c759fe9f5c16c53d9e9c (patch) | |
tree | 6df8eddcaeff6cde892c8cae6bdfa7653805e144 /include/linux/workqueue.h | |
parent | 1e19ffc63dbbaea7a7d1c63d99c38d3e5a4c7edf (diff) |
workqueue: reimplement workqueue freeze using max_active
Currently, workqueue freezing is implemented by marking the worker
freezeable and calling try_to_freeze() from dispatch loop.
Reimplement it using cwq->limit so that the workqueue is frozen
instead of the worker.
* workqueue_struct->saved_max_active is added which stores the
specified max_active on initialization.
* On freeze, all cwq->max_active's are quenched to zero. Freezing is
complete when nr_active on all cwqs reach zero.
* On thaw, all cwq->max_active's are restored to wq->saved_max_active
and the worklist is repopulated.
This new implementation allows having single shared pool of workers
per cpu.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'include/linux/workqueue.h')
-rw-r--r-- | include/linux/workqueue.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index eb753b7790e5..ab0b7fb99bc2 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
@@ -340,4 +340,11 @@ static inline long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) | |||
340 | #else | 340 | #else |
341 | long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg); | 341 | long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg); |
342 | #endif /* CONFIG_SMP */ | 342 | #endif /* CONFIG_SMP */ |
343 | |||
344 | #ifdef CONFIG_FREEZER | ||
345 | extern void freeze_workqueues_begin(void); | ||
346 | extern bool freeze_workqueues_busy(void); | ||
347 | extern void thaw_workqueues(void); | ||
348 | #endif /* CONFIG_FREEZER */ | ||
349 | |||
343 | #endif | 350 | #endif |