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>
Signed-off-by: azrim <mirzaspc@gmail.com>
This commit is contained in:
Sultan Alsawaf 2022-05-04 09:28:34 -07:00 committed by azrim
parent 1a58d5951e
commit 64a6b2c346
No known key found for this signature in database
GPG Key ID: 497F8FB059B45D1C

View File

@ -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;
}
/**