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