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 ee8e29a2320..f02c4a4a0c3 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -272,6 +272,15 @@ static cpumask_var_t *wq_numa_possible_cpumask;  static bool wq_disable_numa;  module_param_named(disable_numa, wq_disable_numa, bool, 0444); +/* see the comment above the definition of WQ_POWER_EFFICIENT */ +#ifdef CONFIG_WQ_POWER_EFFICIENT_DEFAULT +static bool wq_power_efficient = true; +#else +static bool wq_power_efficient; +#endif + +module_param_named(power_efficient, wq_power_efficient, bool, 0444); +  static bool wq_numa_enabled;		/* unbound NUMA affinity enabled */  /* buf for wq_update_unbound_numa_attrs(), protected by CPU hotplug exclusion */ @@ -305,6 +314,10 @@ struct workqueue_struct *system_unbound_wq __read_mostly;  EXPORT_SYMBOL_GPL(system_unbound_wq);  struct workqueue_struct *system_freezable_wq __read_mostly;  EXPORT_SYMBOL_GPL(system_freezable_wq); +struct workqueue_struct *system_power_efficient_wq __read_mostly; +EXPORT_SYMBOL_GPL(system_power_efficient_wq); +struct workqueue_struct *system_freezable_power_efficient_wq __read_mostly; +EXPORT_SYMBOL_GPL(system_freezable_power_efficient_wq);  static int worker_thread(void *__worker);  static void copy_workqueue_attrs(struct workqueue_attrs *to, @@ -4086,6 +4099,10 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt,  	struct workqueue_struct *wq;  	struct pool_workqueue *pwq; +	/* see the comment above the definition of WQ_POWER_EFFICIENT */ +	if ((flags & WQ_POWER_EFFICIENT) && wq_power_efficient) +		flags |= WQ_UNBOUND; +  	/* allocate wq and format name */  	if (flags & WQ_UNBOUND)  		tbl_size = wq_numa_tbl_len * sizeof(wq->numa_pwq_tbl[0]); @@ -4985,8 +5002,15 @@ static int __init init_workqueues(void)  					    WQ_UNBOUND_MAX_ACTIVE);  	system_freezable_wq = alloc_workqueue("events_freezable",  					      WQ_FREEZABLE, 0); +	system_power_efficient_wq = alloc_workqueue("events_power_efficient", +					      WQ_POWER_EFFICIENT, 0); +	system_freezable_power_efficient_wq = alloc_workqueue("events_freezable_power_efficient", +					      WQ_FREEZABLE | WQ_POWER_EFFICIENT, +					      0);  	BUG_ON(!system_wq || !system_highpri_wq || !system_long_wq || -	       !system_unbound_wq || !system_freezable_wq); +	       !system_unbound_wq || !system_freezable_wq || +	       !system_power_efficient_wq || +	       !system_freezable_power_efficient_wq);  	return 0;  }  early_initcall(init_workqueues); | 
