挂起/休眠通知器¶
- 版权所有:
© 2016 英特尔公司
- 作者:
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()
宏。