diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/power/Kconfig | 20 | ||||
| -rw-r--r-- | kernel/workqueue.c | 13 |
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 | ||
| 266 | config 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 | |||
| 266 | config PM_GENERIC_DOMAINS_SLEEP | 286 | config 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; | |||
| 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 */ |
| @@ -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]); |
