挂起/休眠通知器¶
- 版权所有:
© 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() 宏。