diff options
Diffstat (limited to 'kernel/workqueue.c')
-rw-r--r-- | kernel/workqueue.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index ee8e29a2320c..f02c4a4a0c3c 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -272,6 +272,15 @@ static cpumask_var_t *wq_numa_possible_cpumask; | |||
272 | static bool wq_disable_numa; | 272 | static bool wq_disable_numa; |
273 | module_param_named(disable_numa, wq_disable_numa, bool, 0444); | 273 | module_param_named(disable_numa, wq_disable_numa, bool, 0444); |
274 | 274 | ||
275 | /* see the comment above the definition of WQ_POWER_EFFICIENT */ | ||
276 | #ifdef CONFIG_WQ_POWER_EFFICIENT_DEFAULT | ||
277 | static bool wq_power_efficient = true; | ||
278 | #else | ||
279 | static bool wq_power_efficient; | ||
280 | #endif | ||
281 | |||
282 | module_param_named(power_efficient, wq_power_efficient, bool, 0444); | ||
283 | |||
275 | static bool wq_numa_enabled; /* unbound NUMA affinity enabled */ | 284 | static bool wq_numa_enabled; /* unbound NUMA affinity enabled */ |
276 | 285 | ||
277 | /* buf for wq_update_unbound_numa_attrs(), protected by CPU hotplug exclusion */ | 286 | /* buf for wq_update_unbound_numa_attrs(), protected by CPU hotplug exclusion */ |
@@ -305,6 +314,10 @@ struct workqueue_struct *system_unbound_wq __read_mostly; | |||
305 | EXPORT_SYMBOL_GPL(system_unbound_wq); | 314 | EXPORT_SYMBOL_GPL(system_unbound_wq); |
306 | struct workqueue_struct *system_freezable_wq __read_mostly; | 315 | struct workqueue_struct *system_freezable_wq __read_mostly; |
307 | EXPORT_SYMBOL_GPL(system_freezable_wq); | 316 | EXPORT_SYMBOL_GPL(system_freezable_wq); |
317 | struct workqueue_struct *system_power_efficient_wq __read_mostly; | ||
318 | EXPORT_SYMBOL_GPL(system_power_efficient_wq); | ||
319 | struct workqueue_struct *system_freezable_power_efficient_wq __read_mostly; | ||
320 | EXPORT_SYMBOL_GPL(system_freezable_power_efficient_wq); | ||
308 | 321 | ||
309 | static int worker_thread(void *__worker); | 322 | static int worker_thread(void *__worker); |
310 | static void copy_workqueue_attrs(struct workqueue_attrs *to, | 323 | static void copy_workqueue_attrs(struct workqueue_attrs *to, |
@@ -4086,6 +4099,10 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt, | |||
4086 | struct workqueue_struct *wq; | 4099 | struct workqueue_struct *wq; |
4087 | struct pool_workqueue *pwq; | 4100 | struct pool_workqueue *pwq; |
4088 | 4101 | ||
4102 | /* see the comment above the definition of WQ_POWER_EFFICIENT */ | ||
4103 | if ((flags & WQ_POWER_EFFICIENT) && wq_power_efficient) | ||
4104 | flags |= WQ_UNBOUND; | ||
4105 | |||
4089 | /* allocate wq and format name */ | 4106 | /* allocate wq and format name */ |
4090 | if (flags & WQ_UNBOUND) | 4107 | if (flags & WQ_UNBOUND) |
4091 | tbl_size = wq_numa_tbl_len * sizeof(wq->numa_pwq_tbl[0]); | 4108 | tbl_size = wq_numa_tbl_len * sizeof(wq->numa_pwq_tbl[0]); |
@@ -4985,8 +5002,15 @@ static int __init init_workqueues(void) | |||
4985 | WQ_UNBOUND_MAX_ACTIVE); | 5002 | WQ_UNBOUND_MAX_ACTIVE); |
4986 | system_freezable_wq = alloc_workqueue("events_freezable", | 5003 | system_freezable_wq = alloc_workqueue("events_freezable", |
4987 | WQ_FREEZABLE, 0); | 5004 | WQ_FREEZABLE, 0); |
5005 | system_power_efficient_wq = alloc_workqueue("events_power_efficient", | ||
5006 | WQ_POWER_EFFICIENT, 0); | ||
5007 | system_freezable_power_efficient_wq = alloc_workqueue("events_freezable_power_efficient", | ||
5008 | WQ_FREEZABLE | WQ_POWER_EFFICIENT, | ||
5009 | 0); | ||
4988 | BUG_ON(!system_wq || !system_highpri_wq || !system_long_wq || | 5010 | BUG_ON(!system_wq || !system_highpri_wq || !system_long_wq || |
4989 | !system_unbound_wq || !system_freezable_wq); | 5011 | !system_unbound_wq || !system_freezable_wq || |
5012 | !system_power_efficient_wq || | ||
5013 | !system_freezable_power_efficient_wq); | ||
4990 | return 0; | 5014 | return 0; |
4991 | } | 5015 | } |
4992 | early_initcall(init_workqueues); | 5016 | early_initcall(init_workqueues); |