韌體快取¶
當 Linux 從掛起狀態恢復時,某些裝置驅動程式需要韌體查詢以重新初始化裝置。在恢復期間,可能有一段時間無法進行韌體查詢,在此短暫時間內,韌體請求將失敗。然而,時間至關重要,延遲驅動程式等待根檔案系統的韌體會延遲使用者體驗的裝置功能。為了支援這些需求,韌體基礎設施為裝置驅動程式實現了韌體快取,用於大多數 API 呼叫,自動在後臺執行。
韌體快取使在裝置驅動程式的掛起和恢復回撥期間使用某些韌體 API 呼叫是安全的。這些 API 呼叫的使用者無需自己快取韌體,以處理系統恢復期間的韌體丟失。
韌體快取的工作原理是在掛起之前請求韌體並將其快取在記憶體中。恢復後,使用韌體 API 的裝置驅動程式將立即訪問韌體,而無需等待根檔案系統掛載或處理根檔案系統掛載時可能發生的查詢競爭問題。
關於韌體快取設定的一些實現細節
韌體快取是透過為每個使用所有同步呼叫的裝置新增一個 devres 條目來設定的,除了
request_firmware_into_buf()。如果使用非同步呼叫,則僅當
request_firmware_nowait()的第二個引數(uevent)為 true 時,才會為裝置設定韌體快取。當 uevent 為 true 時,它會請求向用戶空間傳送一個 kobject uevent,用於透過 sysfs 回退機制進行韌體請求,如果找不到韌體檔案。如果按照上述兩個標準確定需要韌體快取,則透過為發出韌體請求的裝置新增 devres 條目來設定韌體快取。
韌體 devres 條目在裝置的整個生命週期內維護。這意味著即使您 release_firmware(),韌體快取仍然會在從掛起狀態恢復時使用。
在掛起期間設定韌體快取時,回退機制的超時時間暫時縮短至 10 秒,快取設定完成後,超時時間將設定回您配置的舊值。
在掛起時,任何掛起的非 uevent 韌體請求都會被終止,以避免核心停頓,這是透過 kill_requests_without_uevent() 完成的。因此,需要非 uevent 的核心呼叫需要實現它們自己的韌體快取機制,但不得在掛起時使用韌體 API。