挂起/休眠通知器

版权所有:

© 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_PREPAREPM_SUSPEND_PREPARE 事件失败,则已经为该事件成功的通知器将为 PM_POST_HIBERNATIONPM_POST_SUSPEND 调用,分别。

休眠和挂起通知器在持有 pm_mutex 的情况下被调用。它们以通常的方式定义,但它们的最后一个参数没有意义(它总是 NULL)。

要注册和/或注销挂起通知器,请分别使用 register_pm_notifier()unregister_pm_notifier() (都在 include/linux/suspend.h 中定义)。如果您不需要注销通知器,您还可以使用在 include/linux/suspend.h 中定义的 pm_notifier() 宏。