挂起/休眠通知器 【ChatGPT】

发布时间 2023-12-12 16:43:14作者: 摩斯电码

挂起/休眠通知器

版权 © 2016 Intel Corporation

作者 Rafael J. Wysocki rafael.j.wysocki@intel.com

某些子系统或驱动程序可能希望在休眠hibernation/挂起suspend 之前或restore/resume之后执行一些操作,但它们需要系统完全功能,因此驱动程序和子系统的->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()宏。