RFC-0014:放寬 zx_fifo_create 限制

RFC-0014:放寬 zx_fifo_create 限制
狀態已接受
區域
  • Kernel
說明

允許使用元素計數 (非 2 的乘冪) 呼叫 `zx_fifo_create`。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2020-12-02
審查日期 (年-月-日)2020-12-09

摘要

zx_fifo_create 目前要求呼叫端傳遞的元素計數必須是 2 的乘方。 這樣一來,核心就能使用位元遮罩而非模數運算子,判斷緩衝區中包裝記錄的位移,進而對讀取和寫入路徑進行小幅最佳化。

這項限制表示,如果元素大小不是 4096/(2**n) 位元組,使用者就無法有效運用 FIFO 的完整容量;在這些情況下,FIFO 容量 (element_size * element_count) 會小於 FIFO 的可能完整容量 (內部使用 4096 位元組緩衝區)。

提案內容是允許建立任意元素計數的 FIFO (最多可達 FIFO 大小限制),因此 FIFO 記錄可使用完整 FIFO 容量,且大小任意。

提振精神

這項提案的動機是想在區塊堆疊中使用的現有 FIFO 記錄中新增欄位;該欄位是追蹤 ID,用於支援區塊 I/O 的跨程序追蹤。新增這個欄位後,FIFO 記錄的大小會從 32 位元組變更為 40 位元組。

如果 FIFO 記錄長度為 40 個位元組,則 element_count 目前可設定的最大值為 64,這會導致 4096 位元組緩衝區使用 40 * 64 = 2560 個位元組。

這項 RFC 允許 element_count 值為 102,導致使用 40 * 102 = 4080 位元組 (幾乎是 FIFO 可用容量的兩倍)。

設計

這項微不足道的變更已在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中實作。

實作

這項微不足道的變更已在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中實作。

效能

由於核心知道元素數量是 2 的乘方,因此目前可以進行小幅效能最佳化;具體來說,核心可以使用位元 AND 運算來判斷元素在內部緩衝區中的位置,而不是使用模數。

不過,由於核心和使用者空間之間來回跳躍的成本,這種效能最佳化會消失。

具體來說:https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中的效能測試指出,消除這項最佳化措施不會產生可測量的效能成本。

安全性考量

無。

隱私權注意事項

無。

測試

這是微不足道的變更,相關測試已在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中新增。

說明文件

根據新放寬的限制,我們已在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 調整 zx_fifo_create 說明文件。

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

無。

既有技術和參考資料

無。