挂起/休眠通知器

版权所有:

© 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_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() 宏。