aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/power/Kconfig20
-rw-r--r--kernel/workqueue.c13
2 files changed, 33 insertions, 0 deletions
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index 5dfdc9ea180b..46455961a88f 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -263,6 +263,26 @@ config PM_GENERIC_DOMAINS
263 bool 263 bool
264 depends on PM 264 depends on PM
265 265
266config WQ_POWER_EFFICIENT_DEFAULT
267 bool "Enable workqueue power-efficient mode by default"
268 depends on PM
269 default n
270 help
271 Per-cpu workqueues are generally preferred because they show
272 better performance thanks to cache locality; unfortunately,
273 per-cpu workqueues tend to be more power hungry than unbound
274 workqueues.
275
276 Enabling workqueue.power_efficient kernel parameter makes the
277 per-cpu workqueues which were observed to contribute
278 significantly to power consumption unbound, leading to measurably
279 lower power usage at the cost of small performance overhead.
280
281 This config option determines whether workqueue.power_efficient
282 is enabled by default.
283
284 If in doubt, say N.
285
266config PM_GENERIC_DOMAINS_SLEEP 286config PM_GENERIC_DOMAINS_SLEEP
267 def_bool y 287 def_bool y
268 depends on PM_SLEEP && PM_GENERIC_DOMAINS 288 depends on PM_SLEEP && PM_GENERIC_DOMAINS
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 4aa9f5bc6b2d..8068d97ce141 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -272,6 +272,15 @@ static cpumask_var_t *wq_numa_possible_cpumask;
272static bool wq_disable_numa; 272static bool wq_disable_numa;
273module_param_named(disable_numa, wq_disable_numa, bool, 0444); 273module_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
277static bool wq_power_efficient = true;
278#else
279static bool wq_power_efficient;
280#endif
281
282module_param_named(power_efficient, wq_power_efficient, bool, 0444);
283
275static bool wq_numa_enabled; /* unbound NUMA affinity enabled */ 284static 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 */
@@ -4085,6 +4094,10 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt,
4085 struct workqueue_struct *wq; 4094 struct workqueue_struct *wq;
4086 struct pool_workqueue *pwq; 4095 struct pool_workqueue *pwq;
4087 4096
4097 /* see the comment above the definition of WQ_POWER_EFFICIENT */
4098 if ((flags & WQ_POWER_EFFICIENT) && wq_power_efficient)
4099 flags |= WQ_UNBOUND;
4100
4088 /* allocate wq and format name */ 4101 /* allocate wq and format name */
4089 if (flags & WQ_UNBOUND) 4102 if (flags & WQ_UNBOUND)
4090 tbl_size = wq_numa_tbl_len * sizeof(wq->numa_pwq_tbl[0]); 4103 tbl_size = wq_numa_tbl_len * sizeof(wq->numa_pwq_tbl[0]);