挂起/休眠通知器
版权 © 2016 Intel Corporation
作者 Rafael J. Wysocki rafael.j.wysocki@intel.com
某些子系统或驱动程序可能希望在休眠hibernation/挂起suspend 之前或restore/resume之后执行一些操作,但它们需要系统完全功能,因此驱动程序和子系统的->suspend()和->resume()甚至->prepare()和->complete()回调不适合此目的。
例如,设备驱动程序可能希望在恢复/恢复后向其设备上传固件,但它们无法在其->resume()或->complete()回调例程中调用request_firmware()来执行此操作(在这些点上用户进程被冻结)。解决方案可能是在进程被冻结之前将固件加载到内存中,并在->resume()例程中从那里上传它。可以使用挂起/休眠通知器来实现这一点。
具有此类需求的子系统或驱动程序可以注册挂起通知器,这些通知器将在以下事件发生时由PM核心调用:
- PM_HIBERNATION_PREPARE
系统将要休眠,任务将立即被冻结。这与下面的PM_SUSPEND_PREPARE不同,因为在这种情况下,在通知器和"冻结"转换的PM回调被调用之间会执行额外的工作。 - PM_POST_HIBERNATION
系统内存状态已从休眠映像中恢复,或在休眠期间发生错误。设备恢复回调已被执行,任务已被解冻。 - PM_RESTORE_PREPARE
系统将要恢复休眠映像。如果一切顺利,恢复的映像内核将发出PM_POST_HIBERNATION通知。 - PM_POST_RESTORE
从休眠中恢复时发生错误。设备恢复回调已被执行,任务已被解冻。 - PM_SUSPEND_PREPARE
系统正在准备挂起。 - PM_POST_SUSPEND
系统刚刚恢复或在挂起期间发生错误。设备恢复回调已被执行,任务已被解冻。
通常假定PM_HIBERNATION_PREPARE的通知器所做的任何操作,应该在PM_POST_HIBERNATION时撤消。类似地,为PM_SUSPEND_PREPARE执行的操作应该在PM_POST_SUSPEND时被撤销。
此外,如果PM_HIBERNATION_PREPARE或PM_SUSPEND_PREPARE事件中的一个通知器失败,已经成功执行该事件的通知器将分别被调用以进行PM_POST_HIBERNATION或PM_POST_SUSPEND。
休眠和挂起通知器在持有pm_mutex时被调用。它们以通常的方式定义,但它们的最后一个参数是无意义的(它总是NULL)。
要注册和/或注销挂起通知器,请分别使用register_pm_notifier()和unregister_pm_notifier()(两者均在include/linux/suspend.h中定义)。如果您不需要注销通知器,还可以使用在include/linux/suspend.h中定义的pm_notifier()宏。