挂起/休眠通知器¶
- 版权所有:
© 2016 Intel Corporation
- 作者:
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
有些操作子系统或驱动程序可能需要在休眠/挂起之前或恢复/唤醒之后执行,但它们要求系统完全正常运行,因此驱动程序和子系统的 ->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()
宏。