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

RFC-0252:沒有實體 VMO CacheOps
狀態已接受
區域
  • 核心
說明

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

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

摘要

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

提振精神

實體 VMOs 上的快取作業目前無法正常運作,因為它們依賴 physmap。由於實體 VMOs 只能透過對應操作,因此可以隨時改用現有的 zx_cache_flush 作業。

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

相關人員

協助人員:

cpu@google.com

審查者:

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

諮詢:

社會化:

已在 Zircon 核心/VM 團隊之間討論。

設計

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

  • ZX_VMO_OP_CACHE_SYNC
  • ZX_VMO_OP_CACHE_INVALIDATE
  • ZX_VMO_OP_CACHE_CLEAN
  • ZX_VMO_OP_CACHE_CLEAN_INVALIDATE

對非實體 VMOs 執行的這些作業 (也就是透過 zx_vmo_createzx_vmo_create_contiguouszx_vmo_create_childzx_pager_create_vmo 建立的作業) 將保持不變,並且會像先前一樣運作。

這會導致實體 VMOs 和分頁式 VMOs 之間的 API 不一致,這並非理想情況,因為程式碼可能需要容許這兩種情況。不過,實體 VMO 並未廣泛使用,且目前無法從所有 VMO 移除快取作業,因此需要支援這兩種 VMO 的程式碼必須確保可使用對應項目。

實作

樹狀結構中實體 VMO 快取作業的用途不多,因為需要快取作業的大部分位置都已使用偏好的 zx_cache_flush。在 VMO 快取作業的現有用途中,總會有可用於 zx_cache_flush 的現有對應項目,因此遷移作業就會變得簡單。

因此,實施計畫如下:

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

成效

使用 zx_cache_flush 執行快取作業應該比執行系統呼叫更有效率,因此這項變更通常會帶來淨效能提升。這項做法的例外狀況是,如果需要建立對應項目,但實體 VMOs 不常使用,目前也沒有這種情況。如有需要,我們日後會重新考慮這項決定。

人體工學

目前大多數快取作業都已使用 zx_cache_flush 執行,因為在可行情況下,使用 zx_cache_flush 更簡單、更方便,且從人體工學的角度來看,總是比 VMO 作業更受青睞。不過,如果對應項目尚未存在,這項做法就會變得非常不人性化。

回溯相容性

這是 API 重大變更,但快取作業是由少數使用者 (通常是驅動程式和類似程式) 執行,而且只有少數使用者有實體 VMOs,因此對現有程式碼來說,應不難進行遷移。

安全性考量

此提案會從核心移除程式碼和邏輯,並在使用者在特權模式下執行時,避免使用者控制的快取作業發生在潛在的裝置記憶體中。因此,從安全性角度來看,這項功能的評價介於中立和略為正面之間。

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

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

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

可能有使用者:

  • 沒有對應項目。
  • 沒有可建立對應的非效能關鍵初始化點。
  • 否則,執行快取作業時,效能會受到嚴重影響。

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

為所有 VMOs 移除

為所有 VMOs 移除快取作業可提供一致的 API,避免在先前只預期分頁式 VMOs 的情況下,程式碼可能失敗的情況。

很遺憾,在某些常見的模式中,服務或驅動程式庫可能會獲得 VMO,而無需在綁定並傳遞至基礎硬體之前建立對應項目。在這種情況下,用戶端寫入的資料可能需要透過快取作業清除至記憶體。不過,在 VMO 固定之前,其底層頁面可能會遭核心變更,導致先前清除快取的效果不佳。由於只有驅動程式庫 (而非用戶端) 可以綁定記憶體,因此驅動程式庫必須在綁定後執行快取作業。在這種情況下,要求對應項目執行這項操作,會為驅動程式庫增加不必要的額外負擔。

為實體 VMOs 提供獨立的核心對應

核心可以為每個實體 VMO 建立個別對應項目,而非依賴 physmap,並對此對應項目執行快取作業。

這確實解決了 physmap 用法的直接問題,解除所有相關核心變更,並確保沒有對應的假設效能重要使用者不會受到影響。

缺點如下:

  • 需要分配其他頁面表格才能保留此對應項目,如果使用者有對應項目,這會浪費記憶體。實體 VMOs 的範圍可能相當廣泛。
  • 增加核心複雜度,並繼續允許使用者在可能導致核心錯誤的無效範圍上執行快取作業。

臨時核心對應

只要在快取作業程式碼路徑中執行暫時對應作業,即可減輕頁面表格的額外負擔。不過,相較於使用者自行執行暫時對應作業,這項做法幾乎沒有任何好處,因此並未實際改善原始提案。