RFC-0252:無實體 VMO 快取運作

RFC-0252:No Physical VMO CacheOps
狀態已接受
區域
  • Kernel
說明

移除實體 VMO 上的快取作業。

Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2024-06-12
審查日期 (年-月-日)2024-07-18

摘要

移除直接在實體 VMO 上執行快取作業的功能。

提振精神

由於實體 VMO 的快取作業依賴 physmap,因此目前無法穩定運作。由於實體 VMO 只能透過對應進行操作,因此一律可改用現有的 zx_cache_flush 作業。

實體 VMO 通常代表實體位址空間的非 RAM 區域,例如 MMIO 暫存器。執行快取作業最多是毫無意義,最糟的情況則是發生嚴重錯誤,具體情況取決於架構和硬體。雖然實體 VMO 已經需要受限資源才能建立,但盡量減少使用者導致核心當機的方式仍是好事。

利害關係人

協助人員:

cpu@google.com

審查者:

mcgrathr@google.com、hansens@google.com、jbauman@google.com

已諮詢:

社交:

Zircon 核心/VM 團隊已討論過。

設計

由於 zx_cache_flush 已經存在並已實作,因此這項提案不需要建構任何新內容。因此,提案只是要移除對實體 VMO (即由 zx_vmo_create_physical 建立的 VMO) 的下列作業支援:

  • ZX_VMO_OP_CACHE_SYNC
  • ZX_VMO_OP_CACHE_INVALIDATE
  • ZX_VMO_OP_CACHE_CLEAN
  • ZX_VMO_OP_CACHE_CLEAN_INVALIDATE

對非實體 VMO 執行的這些作業 (即透過 zx_vmo_createzx_vmo_create_contiguouszx_vmo_create_childzx_pager_create_vmo 建立的 VMO) 不會受到影響,行為與先前相同。

這會導致實體 VMO 和分頁 VMO 之間的 API 不同,這並非理想情況,因為程式碼可能需要容許提供任一類型的 VMO。不過,實體 VMO 並不常用,而且目前無法從所有 VMO 移除快取作業,因此需要支援任一類型的 VMO 的程式碼,都必須確保有可用的對應。

實作

樹狀結構中實體 VMO 快取作業的使用次數不多,因為大部分需要快取作業的位置都已使用偏好的 zx_cache_flush。在現有的 VMO 快取作業用法中,一律有可改用於 zx_cache_flush 的現有對應,因此遷移作業非常簡單。

實作計畫如下:

  1. 遷移所有涉及實體 VMO 的現有 VMO 快取作業用量。
  2. 在實體 VMO 上停用快取作業,並讓這些作業傳回 ZX_ERR_NOT_SUPPORTED

效能

使用 zx_cache_flush 執行快取作業的效率應該會比執行系統呼叫更高,因此這項變更通常會帶來整體效能提升。但如果需要建立對應,則不在此限。不過,實體 VMO 並不常用,目前也沒有這類案例。日後如有需要,可以重新考慮這項決定。

人體工學

目前大多數的快取作業都已使用 zx_cache_flush 執行,因為盡可能使用這項作業會更輕鬆方便,而且從人體工學的角度來看,這項作業也一律優於 VMO 作業。不過,如果對應不存在,則會大幅降低人體工學。

回溯相容性

這是 API 的破壞性變更,但快取作業是由一小部分使用者 (通常是駕駛員和類似人員) 執行,而且擁有實體 VMO 的使用者更少,因此現有程式碼的遷移作業應該不會太困難。

安全性考量

這項提案會從核心移除程式碼和邏輯,並在以具備權限的模式執行時,防止使用者控制的快取作業對潛在的裝置記憶體執行。因此從安全性的角度來看,這項功能是中性或略為正面的。

缺點、替代方案和未知事項

這項提案的假設是,實體 VMO 快取作業的使用者會:

  • 您已擁有對應項,因此切換至對應項執行快取作業可提升效能,且不會有任何缺點。
  • 沒有對應,但可以在非效能關鍵的初始化區段中建立對應。
  • 沒有對應,並非效能關鍵,且可建立暫時對應來執行快取作業。

使用者可能:

  • 沒有對應。
  • 沒有非效能關鍵的初始化點,可建立對應。
  • 否則在執行快取作業時,效能至關重要。

根據現有使用者和不支援的潛在使用者,我們可以考慮一些替代方案,避免完全移除快取作業。

為所有 VMO 移除

移除所有 VMO 的快取作業可提供統一的 API,避免程式碼在收到實體 VMO 時可能失敗的情況,因為先前程式碼只預期會收到分頁 VMO。

很遺憾,常見模式是服務或驅動程式庫可能會取得 VMO,且不需要在釘選並傳遞至基礎硬體之前建立對應。在這種情況下,用戶端寫入的資料可能需要透過快取作業清除至記憶體。不過,在 VMO 固定之前,核心可能會變更其基礎頁面,導致先前清除的快取不足。只有驅動程式庫 (而非用戶端) 可以釘選記憶體,因此驅動程式庫必須在釘選後執行快取作業。在這種情況下,要求對應會為驅動程式庫增加不必要的負擔。

實體 VMO 的獨立核心對應

核心可以為每個實體 VMO 建立個別的對應,並對這個對應執行快取作業,而不必依賴 physmap。

這項做法可解決 physmap 使用的直接問題、解除所有相關核心變更的封鎖,並確保沒有對應的假設性效能關鍵使用者不會受到影響。

缺點如下:

  • 需要分配額外的頁面表格,才能保留這個對應,如果使用者有對應,就會浪費記憶體。實體 VMO 可能會涵蓋相當大的範圍。
  • 增加核心複雜度,並持續允許使用者對無效範圍執行快取作業,可能導致核心發生錯誤。

暫時性核心對應

您可以在快取作業程式碼路徑中執行暫時對應,減輕頁面資料表的負擔。不過,這項做法與使用者自行執行暫時對應相比,好處並不多,因此實際上並未改善原始提案。