PM / freezer: Abort suspend when there's a wakeup while freezing

Although try_to_freeze_tasks() stops when there's a wakeup, it doesn't
return an error when it successfully freezes everything it wants to freeze.
As a result, the suspend attempt can continue even after a wakeup is
issued. Although the wakeup will be eventually caught later in the suspend
process, kicking the can down the road is suboptimal; when there's a wakeup
detected, suspend should be immediately aborted by returning an error
instead. Make try_to_freeze_tasks() do just that, and also move the wakeup
check above the `todo` check so that we don't miss a wakeup from a process
that successfully froze.

Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
Change-Id: I6d0ff54b1e1e143df2679d3848019590725c6351
fourteen
Sultan Alsawaf 3 years ago committed by Jenna
parent 3ddc1c7db4
commit c28edb536b
  1. 8
      kernel/power/process.c

@ -65,14 +65,14 @@ static int try_to_freeze_tasks(bool user_only)
todo += wq_busy;
}
if (!todo || time_after(jiffies, end_time))
break;
if (pm_wakeup_pending()) {
wakeup = true;
break;
}
if (!todo || time_after(jiffies, end_time))
break;
/*
* We need to retry, but first give the freezing tasks some
* time to enter the refrigerator. Start with an initial
@ -113,7 +113,7 @@ static int try_to_freeze_tasks(bool user_only)
elapsed_msecs % 1000);
}
return todo ? -EBUSY : 0;
return todo || wakeup ? -EBUSY : 0;
}
/**

Loading…
Cancel
Save