mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 17:11:46 +00:00
workqueue: Add system wide power_efficient workqueues
This patch adds system wide workqueues aligned towards power saving. This is done by allocating them with WQ_UNBOUND flag if 'wq_power_efficient' is set to 'true'. tj: updated comments a bit. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
cee22a1505
commit
0668106ca3
2 changed files with 20 additions and 1 deletions
|
@ -360,11 +360,19 @@ enum {
|
||||||
*
|
*
|
||||||
* system_freezable_wq is equivalent to system_wq except that it's
|
* system_freezable_wq is equivalent to system_wq except that it's
|
||||||
* freezable.
|
* freezable.
|
||||||
|
*
|
||||||
|
* *_power_efficient_wq are inclined towards saving power and converted
|
||||||
|
* into WQ_UNBOUND variants if 'wq_power_efficient' is enabled; otherwise,
|
||||||
|
* they are same as their non-power-efficient counterparts - e.g.
|
||||||
|
* system_power_efficient_wq is identical to system_wq if
|
||||||
|
* 'wq_power_efficient' is disabled. See WQ_POWER_EFFICIENT for more info.
|
||||||
*/
|
*/
|
||||||
extern struct workqueue_struct *system_wq;
|
extern struct workqueue_struct *system_wq;
|
||||||
extern struct workqueue_struct *system_long_wq;
|
extern struct workqueue_struct *system_long_wq;
|
||||||
extern struct workqueue_struct *system_unbound_wq;
|
extern struct workqueue_struct *system_unbound_wq;
|
||||||
extern struct workqueue_struct *system_freezable_wq;
|
extern struct workqueue_struct *system_freezable_wq;
|
||||||
|
extern struct workqueue_struct *system_power_efficient_wq;
|
||||||
|
extern struct workqueue_struct *system_freezable_power_efficient_wq;
|
||||||
|
|
||||||
static inline struct workqueue_struct * __deprecated __system_nrt_wq(void)
|
static inline struct workqueue_struct * __deprecated __system_nrt_wq(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -314,6 +314,10 @@ struct workqueue_struct *system_unbound_wq __read_mostly;
|
||||||
EXPORT_SYMBOL_GPL(system_unbound_wq);
|
EXPORT_SYMBOL_GPL(system_unbound_wq);
|
||||||
struct workqueue_struct *system_freezable_wq __read_mostly;
|
struct workqueue_struct *system_freezable_wq __read_mostly;
|
||||||
EXPORT_SYMBOL_GPL(system_freezable_wq);
|
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 int worker_thread(void *__worker);
|
||||||
static void copy_workqueue_attrs(struct workqueue_attrs *to,
|
static void copy_workqueue_attrs(struct workqueue_attrs *to,
|
||||||
|
@ -4987,8 +4991,15 @@ static int __init init_workqueues(void)
|
||||||
WQ_UNBOUND_MAX_ACTIVE);
|
WQ_UNBOUND_MAX_ACTIVE);
|
||||||
system_freezable_wq = alloc_workqueue("events_freezable",
|
system_freezable_wq = alloc_workqueue("events_freezable",
|
||||||
WQ_FREEZABLE, 0);
|
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 ||
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
early_initcall(init_workqueues);
|
early_initcall(init_workqueues);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue