RFC-0014:放寬 zx_fifo_create 限制

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

允許 `zx_fifo_create` 呼叫的元素數量不是 2 的冪次方。

問題
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 中已新增測試。

說明文件

zx_fifo_create 說明文件已根據新的放寬限制進行調整,詳情請見 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498。

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

無。

既有技術與參考資料

無。