PM: hibernate: Avoid missing wakeup events during hibernation
authorChris Feng <chris.feng@mediatek.com>
Wed, 13 Dec 2023 08:32:51 +0000 (16:32 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 15 Dec 2023 11:33:39 +0000 (12:33 +0100)
commit0c4cae1bc00d31c78858c184ede351baea232bdb
tree1cc59e97e1bb33cff2c86e44f94ab6fed82974f0
parent4ac934b1aaa99e00ca25875d55094a4fe34e212d
PM: hibernate: Avoid missing wakeup events during hibernation

Wakeup events that occur in the hibernation process's
hibernation_platform_enter() cannot wake up the system. Although the
current hibernation framework will execute part of the recovery process
after a wakeup event occurs, it ultimately performs a shutdown operation
because the system does not check the return value of
hibernation_platform_enter(). In short, if a wakeup event occurs before
putting the system into the final low-power state, it will be missed.

To solve this problem, check the return value of
hibernation_platform_enter(). When it returns -EAGAIN or -EBUSY (indicate
the occurrence of a wakeup event), execute the hibernation recovery
process, discard the previously saved image, and ultimately return to the
working state.

Signed-off-by: Chris Feng <chris.feng@mediatek.com>
[ rjw: Rephrase the message printed when going back to the working state ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
kernel/power/hibernate.c
kernel/power/power.h