mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-04 14:10:46 +00:00
freezer: skip waking up tasks with PF_FREEZER_SKIP set
Android goes through suspend/resume very often (every few seconds when on a busy wifi network with the screen off), and a significant portion of the energy used to go in and out of suspend is spent in the freezer. If a task has called freezer_do_not_count(), don't bother waking it up. If it happens to wake up later it will call freezer_count() and immediately enter the refrigerator. Combined with patches to convert freezable helpers to use freezer_do_not_count() and convert common sites where idle userspace tasks are blocked to use the freezable helpers, this reduces the time and energy required to suspend and resume. Acked-by: Tejun Heo <tj@kernel.org> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Colin Cross <ccross@android.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
18ad0c6297
commit
613f5d13b5
@ -110,6 +110,18 @@ bool freeze_task(struct task_struct *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* This check can race with freezer_do_not_count, but worst case that
|
||||
* will result in an extra wakeup being sent to the task. It does not
|
||||
* race with freezer_count(), the barriers in freezer_count() and
|
||||
* freezer_should_skip() ensure that either freezer_count() sees
|
||||
* freezing == true in try_to_freeze() and freezes, or
|
||||
* freezer_should_skip() sees !PF_FREEZE_SKIP and freezes the task
|
||||
* normally.
|
||||
*/
|
||||
if (freezer_should_skip(p))
|
||||
return false;
|
||||
|
||||
spin_lock_irqsave(&freezer_lock, flags);
|
||||
if (!freezing(p) || frozen(p)) {
|
||||
spin_unlock_irqrestore(&freezer_lock, flags);
|
||||
|
Loading…
Reference in New Issue
Block a user