掛起/休眠通知器

版權所有:

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